码迷,mamicode.com
首页 > 其他好文 > 详细

观察者模式

时间:2017-10-29 18:36:31      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:中介   const   tor   serve   add   val   each   rto   instance   

观察者模式


用于查看目标对象状态的对象,提供与核心功能非耦合的指定功能.

 

class Product
{
    private $observers = array();
    private $pid = 0;

    public function __construct($pid)
    {
        $this->pid = $pid;
    }
    
    // 注册观察者
    public function attachObserver($observer)
    {
        $this->observers[] = $observer;
    }

    public function buy()
    {
        //.....
        $this->notify();
    }
    
    // 通知观察者
    public function notify()
    {
        foreach ($this->observers as $obj) {
            $obj->receiveBuy($this);
        }
    }

    public function getPid()
    {
        return $this->pid;
    }
}

class Repertory
{
    public function receiveBuy(Product $pro)
    {
        echo $pro->getPid() . "被购买了,库存可以减去1了";
    }
}

// 调用示例
$product = new Product(‘s100‘);
$product->attachObserver(new Repertory());
$product->buy();
// 产品一旦被购买,我们就通知库存.

  

中介者模式

一般处理具有类似属性,需要保持同步的非耦合对象时,最佳的做法就是中介者模式.

 

虽然该模式在php中并不常用,但理解起来还是有点困难.

举个例子,我们有一个在线音乐销售商店,我们要添加一张CD的时候,我们也要将这张CD的同名歌曲添加进去(假设CD有这首歌曲).反之亦然,即添加歌曲的时候也添加这张CD进去(假设CD只有这一首歌曲)

class CD
{
    private $cdname;
    private $mediator;

    public function __construct(Mediator $mediator = null)
    {
        $this->mediator = $mediator;
    }

    public function addItem($cdname)
    {
        $this->cdname = $cdname;
        $this->save();

        // 调用中介,需要先判断是否为空,为空则为中介类中调用
        if (! is_null($this->mediator)) {
            $this->mediator->change($this, $cdname);
        }
    }

    public function save()
    {
        echo "cd save: {$this->cdname}<br>";
    }
}

class Music
{
    private $music;
    private $mediator;

    public function __construct(Mediator $mediator = null)
    {
        $this->mediator = $mediator;
    }

    public function addItem($music)
    {
        $this->music = $music;
        $this->save();

        // 调用中介,需要先判断是否为空,为空则为中介类中调用
        if (! is_null($this->mediator)) {
            $this->mediator->change($this, $music);
        }
    }

    public function save()
    {
        echo "music save: {$this->music}<br>";
    }
}

// 中介类
class Mediator
{
    private $container = array(‘CD‘, ‘Music‘);

    public function change($obj, $newValue)
    {
        foreach ($this->container as $container) {
            // 因为中介的一端执行了相应的方法,所以排除这端,查找在中介这儿登记的其他端
            if (! ($obj instanceof $container)) {
                $newObj = new $container;
                $newObj->addItem($newValue);
            }
        }
    }
}

$mediator = new Mediator();
// 添加cd的情况
$cd = new CD($mediator);
$cd->addItem(‘rolling in the deep‘);
// 添加歌曲的情况
$music = new Music($mediator);
$music->addItem(‘rolling in the deep‘);

// 无论只添加歌曲,还是只添加音乐,都保持了两者的同步添加.

 

ps:中介者模式非常像观察者模式,但区别是被观察者如果有变化,被观察者负责通知所有的观察者.中介者模式,处于中介中A方改变了,由与A联系的中介者负责通知除了A方外的其他对象.

观察者模式

标签:中介   const   tor   serve   add   val   each   rto   instance   

原文地址:http://www.cnblogs.com/itfenqing/p/7750578.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!