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