PHP常用设计模式——行为型

 空对象

<?php                                         //空对象
                                              //不会出现null现象,而且调用任何方法都不会错误
                                              

class NullObject{
	public function __call($method,$arg){     //必须带这两个参数
		echo 'this is null';                      //可以在此抛出异常
        echo $method;
		dump($arg);	
	}
}
$obj=new NullObject();
var_dump($obj);
$obj->testFunction();

策略模式

<?php 
class Lesson{                              //将一组类似的类,根据不同参数,来实现

	public $day;
	public $strategy;

	public function __construct($day,$strategy){
		$this->day=$day;
		$this->strategy=$strategy;
	}

	public function start(){
		$this->strategy->start($this);
	}

}
class Math{

	public function start(Lesson $lession){
		echo "星期$lession->day,开始上数学课<br />";
		
	}
}

class English{

	public function start(Lesson $lession){
		echo "星期$lession->day,开始上英语课<br />";
	}
}

$lession=new Lesson(5,new Math());	
$lession->start();

$lession=new Lesson(1,new English());	
$lession->start();

命令模式

<?php                             //将各种操作放到一个类中
                                  // 根据参数下标,执行相应命令
class Person{

	public $executes=array();
	public function addExecute($execute){
		$this->executes[]=$execute;
	}
	public function runExecute($index,$args){
		foreach($this->executes as $execute){
			$execute->onAction($index,$args);
		}
	}

}

Interface Action{
	public function onAction($index,$args);
}

class ShoutAction implements Action{
	public function onAction($index,$args){
		if($index!='Shout'){
			return false;
		}
		echo "我要大声喊了";
		return true;
	}
}
class SleepAction implements Action{
	public function onAction($index,$args){
		if($index!='Sleep'){
			return false;
		}
		echo "我要开始睡觉了";
		return true;
	}
}
$p=new Person();
$p->addExecute(new ShoutAction());
$p->addExecute(new SleepAction());
$p->runExecute('Shout',null);


观察者模式

<?php                 //如果两个类需要同时更新,可以用观察者模式
                      //   把需要更新的类及其方法 放到 Subject 中 一起更新

class Subject implements SplSubject{       //主题类需要继承此类

	private $observers;

	public function attach(SplObserver  $observer){

			$this->observers[]=$observer;
	}

	public function detach(SplObserver  $observer){

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

	}

	public function setCount($count){  
	        echo "数据量加" . $count;  
	}  

	public function setIntegral($integral){  
	    echo "积分量加" . $integral;  
	}


	public function notify(){

		foreach($this->observers as $observer){
			$observer->update($this);
		}
	}

}

class Observer1 implements SplObserver{    //观察者需要继承此类

	public function update($subject){
		$subject->setCount(1);
	}
}

class Observer2 implements SplObserver{

	public function update($subject){
		$subject->setIntegral(10);
	}
}

$subject = new Subject();  
$subject->attach(new Observer1());  
$subject->attach(new Observer2());  
$subject->notify();                   //输出:数据量加1 积分量加10  
	    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值