PHP的几种设计模式

1.工厂模式:好处是如果类名改变,只需要改一下工厂就可以了,因为其它PHP文件调用的都是createXX()方法

class Factory{

    public static function createDb(){

        return new Db();

    }

}


2.单例模式 singleton:好处是不需要重复创建类对象,减少浪费资源,特别适用于数据库连接

  两个点:1public static function get()里申明一个static变量 static db形成单例

                  2. 构造设置成私有

class A{

    private function __construct(){}


    public static function get(){

        static $db = null;

        if($db == null){

             $db = new DB();

        }

        return $db:

    }

}


3.注册树模式:把各种类的对象通过set方法放到一个数组中,通过get方法取来使用

具体实现

class Register{

    private static objects = array();

    public static function set($alias, $obj){

        self::objects[$alias] = $obj;

    }

    public static function get($name){

        return self::objects[$name];

    }


   public static function _unset($name){

       unset(self::objects[$name]);

   }

}

调用方法:

在初始化等情况下注册对象,然后在业务里使用get方法取得对象

Register::set('db',Factory::createDb())

$db = Register::get('db');


4.策略模式:好处是不用if{}elseif{}来判断上下文环境,减轻耦合

定义:将一组特写的行为和算法封装成类,以适应程序特写的上下文环境

具体实现:

interface StockTradeStrategy{

    public function trade();

    public function jump();

}

class EqualStockTradeStrategy implement StockTradeStrategy{

    public function trade(){

        //等差交易法具体实现 

    }

    public funciton jump(){

        //等差交易跳跃实现

    }

}


class RadioStockTradeStrategy implement StockTradeStrategy{

    

    public function trade(){

        //等比交易法具体实现 

    }

    public funciton jump(){

        //等比交易跳跃实现

    }

}

使用方法:在具体的类中声明一个保护型或私有成员trade_strategy,并提供setStrategy方法来设置要使用的策略并赋值给trade_strategy

class StockTrade{

    protect $trade_stragegy;

    public function setStrategy(StockTradeStrategy $strategy){

        $this->$trade_strategy = $strategy;

        return $this;//返回this可以实现链式操作

    }

    public function trade(){

        return $this->$trade->strategy->trade();

    }

    public function jump(){

        return $this->$trade->strategy->jump();

   }

}

业务实现:

$stock_trade = Factory::createStockTrade();

$stock_trade->setStrategy(new EqualStockTradeStrategy())->trade();

$stock_trade->setStrategy(new EqualStockTradeStrategy())->jump();


5.适配器模式:好处是可以将不同的函数接口封装成统一的API,比如在实际数据库应用中有mysql,mysqli,pdo,mongoDb等,再比如缓存应用中,可以将memcache,redis,file,apc等不的缓存应用,可以将这些不同的应用封装成统一的一致的应用接口,实现解耦

具体实现:一个接口,存在几个应用就创建几个类实现统一的接口

interface IDatabase(){

    function connect($host,$user,$pwd,$db_name);

    function query($sql);

}

class Mysql implement IDatabase{

    public function connect($host,$user,$pwd,$db_name){

        //省略

    }

    public function query($sql){

        //省略

    }

}

class Mysqli implement IDatabase(){

        //与mysql类一样实现接口方法

}

class MongoDb implement IDatabase(){

        //与mysql类一样实现接口方法

}


6.观察者模式:好处是当一个事件发生后,后面跟着一连串的业务逻辑,传统的编辑方法是在事件的代码后加入处理业务逻辑,如果版本升级需要更多的业务逻辑,代码会变得难以维护,这种方式是耦合的,侵入式的,增加新的逻辑需要更改主体代码,而使用观察者模式,可以变为非侵入式的通知和更新机制,大大降低代码的耦合度

定义:当一个对象发生改变时,依赖它的对象全部收到通知并自动更新

具体实现:一个观察者接口包含更新操作,一个事件产生抽象类包含观察者列表和新增观察者及逐个通知观察者方法,若干个观察者实现类

interface Observer{//观察者接口

    public function update();

}


class BuyObserver implement Observer{

     public function update(){

        echo 'Observer to do buy';

    }

}


class SellObserver implement Observer{

    public function update(){

        echo 'Observer to do sell';

    }

}


abstract class EventGenerator{//事件产生抽象类

    private $observers = array();

    public function addObserver(Observer $observer){

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

    }

    public function notify(){

        foreach($this->$observers as $o){

            $o->update();

        }

    }

}


应用过程:

class Event extends EventGernerator{

    public function tradeEvent(){

        echo 'Event::trade';

        $this->notify();

    }

}


$event = new Event();

if($price<10){

    $event->addObserver(new BuyObserver);

}else{

    $event->addObserver(new SellObserver);

}

$event->tradeEvent();


7.数据对象映射模式ORM,如thinkphp中的字段映射就是,其中find等方法的实现就是使用数据对象映射模式

定义:将对象和数据存储映射起来,对一个对象的操作会映射为对数据存储的操作

具体实现参看thinkphp的实现


8.原型模式:好处就是减少系统资源浪费,提高程序效率

实际就是使用clone,而不是使用new来创建对象,对于大对象来说效果非常好


9.装饰器模式:好处是可以动态添加修改类的功能

添加类的功能在传统编程方法里是添加类的子类来实现新增功能,使用装饰器模式只需要在运行时添加一个装饰器对象即可实现,可以实现最大的灵活度

具体实现:一个装饰接口,若干个装饰实现类,在装饰目标类里实现(详见下面类)

interface DrawDecorator{

    function beforeDraw();

    function afterDraw();

}

class ColorDrawDecorator implements DrawDecorator{

    protect $color;

    public function __construct($color){

        $this->color = $color;

    }

   public function beforeDraw(){

        echo "<div style='color:{$this->color}'>";

    }

    public function afterDraw(){

        echo "</div>";

    }

}


class SizeDrawDecorator implements DrawDecorator{

    protect $size;

    public function __construct($size){

        $this->size = $size;

   }

    //其它实现与上面类似,这里省略

}

在装饰目标类里实现方法:

class Canvas{

    protect $decorators = array();

   public function addDecorator(DrawDecorator $decorator){

        $this->decorators[] = $decorator;

    }

    public function beforeDraw(){

        foreach($this->decorators as $d){

            $d->beforeDraw();

        }

    }

   public function afterDraw(){

        $ds = array_reverse($this->decorators);//这里需要数组反转,以便后装饰方法与前装饰方法一一对应

        foreach($ds as $d){

            $d->afterDraw();

        }

    }


   public function draw(){//主体实现方法

        $this->beforeDraw();//前装饰

        //中间这里是具体的画图实现

        $this->afterDraw();//后装饰

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值