php 常用五种模式

/* 设计模式之单例模式

$_instance 必须声明为静态的私有变量

构造函数必须声明为私有,防止外部程序 new 类从而失去单例模式的意义

getInstance() 方法必须设置为公有的,必须调用此方法以返回实例的一个引用

:: 操作符只能访问静态变量和函数 new 对象会消耗内存

使用场景:最常用的地方是数据库连接

使用单例模式生成一个对象后,该对象可以被其它众多对象所使用

【单例模式适用场景】

1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时

2、当这个唯一实例应该是通过子类化可扩展的。并且用户应该无需更改代码就能使用一个扩展的实例时。

*/

class single {

// 在此属性保存实例

private static $_instance;

// 构造函数声明为 private,防止直接创建对象

private function __construct()  {

echo ‘this is contructor ‘;

}

// 单例方法

public static function  get_instance()  {

if(!isset(self::$_instance))   {

self::$_instance = new self();

}

return self::$_instance;

}

// 阻止用户复制对象实例

private function __clone()  {

trigger_error(‘not allow ‘, E_USER_ERROR);

}

public function test()  {

echo ‘test method ! ‘;

}

}

$test = single::get_instance();

$test->test();

工厂方法

// 共同接口

interface Sender {

public function send();

}

// 两个实现类

class MailSender implements Sender {

public function send()  {

echo "this is mailsender ! ";

}

}

class SmsSender implements Sender {

public function send()  {

echo "this is sms sender !";

}

}

// 工厂类接口

interface Provider {

public function produce();

}

// 两个工厂类

class SendMailFactory implements Provider {

public function produce()  {

return new MailSender();

}

}

class SendSmsFactory implements Provider {

public function produce()  {

return new SmsSender();

}

}

//测试用:

$provider = new SendMailFactory();

$sender = $provider->produce();

$sender->Send();

观察者模式

/* 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新, 又称为发布-订阅(Publish-Subscribe)模式、模型-视图(Model-View)模式、源-监听(Source-Listener)模式、或从属者(Dependents)模式

【观察者模式中主要角色】

抽象主题(Subject)角色:主题角色将所有对观察者对象的引用保存在一个集合中,每个主题可以有任意多个观察者。抽象主题提供了增加和删除观察者对象的接口。

抽象观察者(Observer)角色:为所有的具体观察者定义一个接口,在观察的主题发生改变时更新自己。

具体主题(ConcreteSubject)角色:存储相关状态到具体观察者对象,当具体主题的内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个具体子类实现。

具体观察者(ConcretedObserver)角色:存储一个具体主题对象,存储相关状态,实现抽象观察者角色所要求的更新接口,以使得其自身状态和主题的状态保持一致。

【观察者模式的优点和缺点】

观察者模式的优点:

1、观察者和主题之间的耦合度较小;

2、支持广播通信;

观察者模式的缺点:

1、由于观察者并不知道其它观察者的存在,它可能对改变目标的最终代价一无所知。这可能会引起意外的更新。

【观察者模式适用场景】

1、当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。

2、当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个对象待改变。

3、当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换句话说,你不希望这些对象是紧密耦合的。

*/

//  抽象主题角色

interface Subject {

//  增加一个新的观察者对象

public function attach(Observer $observer);

// 删除一个已注册过的观察者对象

public function detach(Observer $observer);

// 通知所有注册过的观察者对象

public function notifyObservers();

}

// 具体主题角色

class ConcreteSubject implements Subject {

private $_observers;

public function __construct()  {

$this->_observers = array();

}

public function attach(Observer $observer)  {

return array_push($this->_observers, $observer);

}

public function detach(Observer $observer)  {

$index = array_search($observer, $this->_observers);

if($index === false || !array_key_exists($index, $this->_observers))   {

return false;

}

unset($this->_observers[$index]);

return true;

}

public function notifyObservers()  {

if(!is_array($this->_observers))   {

return false;

}

foreach($this->_observers as $observer)   {

$observer->update();

}

return true;

}

}

//抽象观察者角色

interface Observer {

//  更新方法

public function update();

}

class ConcreteObserver implements Observer {

//观察者的名称

private $_name;

public function __construct($name)  {

$this->_name = $name;

}

// 更新方法

public function update()  {

echo ‘ Observer ‘ . $this->_name . ‘ has notified ‘;

}

}

$subject = new ConcreteSubject();

// 添加第一个观察者

$observer1 = new ConcreteObserver(‘long‘);

$subject->attach($observer1);

echo "111 : <br />";

$subject->notifyObservers();

// 添加第二个观察者

$observer2 = new ConcreteObserver(‘Lin‘);

$subject->attach($observer2);

echo "<br /> 2222 <br />";

$subject->notifyObservers();

//删除第一个观察者

$subject->detach($observer1);

echo "<br /> 333 <br />";

echo $subject->notifyObservers();

命令模式

/* 命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。

Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand是命令,实现了Command接口,持有接收对象.命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开

*/

// 接口

interface Command {

public function exe();

}

// 命令

class MyCommand implements Command {

private $receiver;

public function __construct($receiver)  {

$this->receive = $receiver;

}

public function exe()  {

$this->receive->action();

}

}

// 执行命令者

class Receiver {

public function action()  {

echo "Command received ! ";

}

}

// 发出命令

class Invoker {

private $command;

public function __construct($command)  {

$this->command = $command;

}

public function action()  {

$this->command->exe();

}

}

// 示例

$receiver = new Receiver();

$cmd = new MyCommand($receiver);

$invoker = new Invoker($cmd);

$invoker->action();

策略模式

/* 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式可以使算法可独立于使用它的客户而变化 策略模式变化的是算法

1、许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法

2、需要使用一个算法的不同变体。

3、算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的,与算法相关的数据结构

4、一个类定义了多种行为,并且 这些行为在这个类的操作中以多个形式出现。将相关的条件分支移和它们各自的Strategy类中以代替这些条件语句

*/

// 策略模式

interface CashSuper {

abstract function acceptCash($m);

}

class CashNormal implements CashSuper {

public function acceptCash($m)  {

return ‘this is cashNormal ‘ . $m;

}

}

class CashRebate implements CashSuper {

public function acceptCash($m)  {

return ‘this is cashRebate ‘ . $m;

}

}

class CashReturn implements CashSuper {

public function acceptCash($m)  {

return ‘this is cashReturn ‘ . $m;

}

}

class CashContext {

public $cs;

public function __construct($cs)  {

$this->cs = $cs;

}

public function GetResult($money)  {

return $this->cs->acceptCash($money);

}

}

$cc = new CashContext(new CashNormal());

echo $cc -> GetResult(100);

php 常用五种模式,布布扣,bubuko.com

时间: 2024-08-08 05:37:17

php 常用五种模式的相关文章

运营商发展公有云的五种模式--【软件和信息服务】2015.04

这两年公有云发展的如火如荼,运营商受到OTT的打压,自然也不甘落后.虽然发展公有云的形式各异,但运营商发展公有云有五种常见模式. 1)自研模式 自研模式是最高大上的模式,也是所有开源组织最热衷的模式,既然云操作系统.云安全.SDN.NFV等都提供了开源选择,运营商作为高大上的用户,当然很多人想到就是自研.比如现今如日中天的OpenStack.Xen等都为运营商开发自己的云平台提供了很好的基础,Google.阿里云等都为运营商树立了很好的榜样.并且也确实有运营商基于这种模式在运行,包括Verizo

qemu-kvm磁盘读写的缓冲(cache)的五种模式

qemu-kvm磁盘读写的缓冲(cache)模式一共有五种,分别是writethrough, wirteback, none, unsafe, directsync当你对VM读写磁盘的性能有不同的要求的时候,你可以在其启动的参数(cache=xxxx)里面进行一个合理的选择. 现在来简单说一说这五种模式的各自的特点(默认的是writeback) cache=writethrough: 该模式对应的标志位是O_DSYNC,仅当数据被提交到了存储设备里面的时候,写操作 才会被完整的通告.此时host

ADO.NET常用五种对象

1.DataSet对象(包含DataTable)      2. SqlConnection 对象 3.SqlDataAdapter对象(包含Fill方法) 4.DataCommand对象 static void Main(string[] args) { string conn_string = "Data Source=localhost;Initial Catalog=SQLtest;Integrated Security=True"; using(SqlConnection c

深度分析Linux下双网卡绑定七种模式 多网卡的7种bond模式原理

http://blog.csdn.net/abc_ii/article/details/9991845 多网卡的7种bond模式原理 Linux网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6 常用的有三种 mode=0:平衡负载模式,有自动备援,但需要"Switch"支援及设定. mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援. mode=6:平衡负载模式,有自动备援,不必"Switc

js五种设计模式说明与示例

第一种模式:js工厂模式 var lev=function(){         return "啊打";      };      function Parent(){             var  Child = new Object();             Child.name="李小龙";             Child.age="30";             Child.lev=lev;           retur

[]转帖] 浅谈Linux下的五种I/O模型

浅谈Linux下的五种I/O模型 https://www.cnblogs.com/chy2055/p/5220793.html  一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是无法直接操作I/O设备的,其必须通过系统调用请求内核来协助完成I/O动作,而内核会为每个I/O设备维护一个buffer.如下图所示: 整个请求过程为: 用户进程发起请求,内核接受到请求后,从I/O设备中获取数据到buffer中,再将buffer中的数据copy到用户进程的地址空间,该用户进程获取到数

PHP V5 的五种常用设计模式

设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides Design(俗称 "四人帮").所介绍的设计模式背后的核心概念非常简单.经过多年的软件开发实践,Gamma 等人发现了某些具有固定设计的模式,就像建筑师设计房子和建筑物一样,可以为浴室的位置或厨房的构造方式开发模板.使用这些模板或者说设计模式 意味着可以更快地设计更好的建筑物.同样的概念也适用于软件. 设计模式不仅代表着更

java线程池与五种常用线程池策略使用与解析

背景:面试中会要求对5中线程池作分析.所以要熟知线程池的运行细节,如CachedThreadPool会引发oom吗? java线程池与五种常用线程池策略使用与解析 可选择的阻塞队列BlockingQueue详解 首先看一下新任务进入时线程池的执行策略: 如果运行的线程少于corePoolSize,则 Executor始终首选添加新的线程,而不进行排队.(如果当前运行的线程小于corePoolSize,则任务根本不会存入queue中,而是直接运行) 如果运行的线程大于等于 corePoolSize

RabbitMQ五种工作模式学习总结

一.简介最近,在看一些消息中间件的内容,之前都没有好好学习一下消息中间件.本文将对RabbitMQ中五种常用的工作模式做一个简单的介绍和总结.RabbitMQ常用的工作模式有:简单队列模式.工作队列模式.发布订阅模式.路由模式.主题模式.本文参照RabbitMQ官网示例总结,详细可以到官网查看:https://www.rabbitmq.com/getstarted.html. 二.简单队列模式(Simple Queue) [a]模型图:只包含一个生产者以及一个消费者,生产者Producer将消息