标签:中介 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