PHP-中介者模式

大家都在说设计模式,俺们也来插一脚解说一下。
先来中介者模式吧,大家都把设计模式将复杂了。GOF第一中介者模式为:用一个中介对象封装一系列对象的交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立的改变它们之间的交互。中介者模式使原有一对多的依赖变成了一对一的依赖,同事类只依赖中介者,降低了类之间的耦合。
其实说白了就是将下面的联系方式A变成了B方式而已,不仅降低类与类之间的耦合,也减少了我们维护的成本。

[img]http://dl.iteye.com/upload/attachment/0074/9551/da8837a3-fa1e-32c4-82a3-4e26acf43403.png[/img]
图1:联系方式A

[img]http://dl.iteye.com/upload/attachment/0074/9553/69c7887c-9409-3ad9-8f80-9df6d6d76c6a.png[/img]
图2:联系方式B

在A方式下各个对象之间的交互操作非常多;每个对象的行为操作都依赖彼此对方,修改B的一个函数,你就需修改A,C,E三个类的代码,至少修改4个类,在B方式下,可以使各个对象间的耦合松散,只需关心和 Mediator (矩形)的关系,修改一个类既可以。

例子比较通俗,果农与化肥老板,中介是商场。果农如果需要化肥,直接和商场要化肥;化肥老板若需水果,同样直接和商场打交道。照惯例上和UML和代码:

[img]http://dl.iteye.com/upload/attachment/0074/9559/39a8526d-f90e-31bb-9046-103c7c17f4d3.png[/img]

1.定义抽象中介者类,就是商场的抽象,就一个sell方法
interface Mediator{
function sell($name,$number);
}


2.定义抽象同事类,咱们的抽象同事类就是一个人。。。。。。,他buy买东西,他getThings卖东西。
abstract class Human{
protected $mediator=null;
abstract public function getThings($number);
abstract public function buy($name,$number);

public function setMediator($mediator)
{
$this->mediator = $mediator;
}

public function getMediator()
{
return $this->mediator;
}
//set/get自己去加!!
}

3.具体中介者
class ConcreteMediator implements  Mediator{
private $orchardist=null;//果农
private $boss=null;//化肥老板
public function sell($name,$number){
if($name == 'fruit'){
$fruit=$this->orchardist->getThings($number);
echo '商场从果农给你'.$fruit.'!'."\n";
return $fruit;
}
if($name == 'fertilizer'){
$fertilizer=$this->boss->getThings($number);
echo '商场从化肥老板那里给你'.$fertilizer.'!'."\n";
return $fertilizer;
}
}
//set/get自己去加!!

}

4.具体2个同事,果农和化肥老板
class Orchardist extends Human{
public function __construct($mediator){
$this->mediator=$mediator;
}
public function getThings($number){
return $number.'水果';
}
public function buy($name,$number){
$result=$this->mediator->sell($name,$number);
echo '我们果农得到了'.$result."\n";
}

}

class Boss extends Human{
public function __construct($mediator){
$this->mediator=$mediator;
}
public function getThings($number){
return $number.'化肥';
}
public function buy($name,$number){
$result=$this->mediator->sell($name,$number);
echo '我们化肥老板得到了'.$result."\n";
}
}


最后测试:
$mediator=new  ConcreteMediator();
$orchardist=new Orchardist($mediator);
$boss=new Boss($mediator);
$mediator->setOrchardist($orchardist);
$mediator->setBoss($boss);


$orchardist->buy('fertilizer',200);//果农买200袋化肥
$boss->buy('fruit',50);//化肥老板买50个水果

结果:

[img]http://dl.iteye.com/upload/attachment/0074/9561/b8e2a240-ad54-3a26-81b6-d03b2db00a9b.png[/img]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值