PHP设计模式笔记

一、工厂模式:减少new的使用,定义一个类,专门用来创建其它对象
例:

class A{
    static function create(){
        return new DB();
    }
}
$db = A::create();

二、单例模式:确保一个类只有一个实例
使用场景:缓存、日志对象、数据库操作只有一个实例。
缺点:
1. 难于调试
2. 隐藏的依赖关系
例:

class A {
    //静态变量保存全局实例
    private static $_init = null;
    //私有构造函数,防止外部实例化对象
    private function __construct(){
        
    }
    //私有克隆函数,防止外部克隆对象
    private function __clone(){
        
    }
    //静态方法,单例统一访问入口
    public static function getInit(){
        if (!isset(self::$_init)){
            self::$_init = new self();
        }
        return self::$_init;
    }
    
    public function test(){
        echo '调用方法成功';
    }
}

$a = A::getInit();
$a->test();

三、策略模式:把特定行为封装成类,适应特定的环境
使用场景:电商男装女装
例:

//抽象策略接口
interface A{
    public function show();
}
//用于客户端是IE时调用的类(环境角色)
class IE implements  A {
    public function show(){
        return 'ie';
    }
}
//用于客户端不是firefox时调用的类(环境角色)
class FF implements  A {
    public function show(){
        return 'firefox';
    }
}
//具体策略角色
class U {
    public function index($obj){
        echo $obj->show();
    }
}

$user = new U();
$user->index(new FF);

四、观察者模式:当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
使用场景:事件系统
缺点:性能降低
例:

//定义观察者接口
interface Looker {
    public function news($user);//定义接收通知的方法
}
//定义被观察事件的接口
interface Event {
    public function add($obj);//定义被观察事件的方法
    public function notify($user);//定义通知所有观察者的方法
}
//被观察事件
class E1 implements Event {
    protected $obj = array();
    
    public function add($obj){//被观察事件
        $this->obj[] = $obj;
    }
    
    public function notify($user){//通知所有观察者
        foreach($this->obj as $o){
            $o->news($user);
        }
    }
}
//观察者
class L1 implements Looker {
    public function news($user){//接收通知
        echo $user.'有新动态<br>';
    }
}
$event1 = new E1;
$event1->add(new L1);
$event1->notify('小明');
$event1->notify('小红');
$event1->notify('小李');

五、适配器模式:把各种不同的类封装成同一接口
使用场景:数据库mysql,mysqli。缓存memcache,redis,file。可以用适配器模式统一成一致

六、装饰者模式:可以动态的添加修改类的功能
例:

abstract class Beverage{
    public $_name;
    abstract public function Cost();
}
//被装饰者类
class Coffee extends Beverage{
    public function __construct(){
        $this->_name = 'Coffee';
    }

    public function Cost(){
        return 1.00;
    }
}
// 以下三个类是装饰者相关类
class CondimentDecorator extends Beverage{
    public function __construct(){
        $this->_name = 'Condiment';
    }

    public function Cost(){
        return 0.1;
    }
}
//2.加点牛奶
class Milk extends CondimentDecorator{
    public $_beverage;

    public function __construct($beverage){
        $this->_name = 'Milk';

        if($beverage instanceof Beverage){
            $this->_beverage = $beverage;
        }else{
            die('Failure');
        }
    }

    public function Cost(){
        return $this->_beverage->Cost() + 0.2;
    }
}
//3.加点糖
class Sugar extends CondimentDecorator{
    public $_beverage;

    public function __construct($beverage){
        $this->_name = 'Sugar';

        if($beverage instanceof Beverage){
            $this->_beverage = $beverage;
        }else{
            exit('Failure');
        }
    }

    public function Cost(){
        return $this->_beverage->Cost() + 0.2;
    }
}

//1.拿杯咖啡
$coffee = new Coffee();
//2.加点牛奶
$coffee = new Milk($coffee);
//3.加点糖
$coffee = new Sugar($coffee);

printf("Coffee Total:%0.2f元\n",$coffee->Cost());
posted @ 2016-12-07 18:23  成九  阅读(611)  评论(0编辑  收藏  举报