空对象
<?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