PHP-中介者模式

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


图1:联系方式A


图2:联系方式B

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

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



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个水果

结果:














  • 大小: 17 KB
  • 大小: 16.5 KB
  • 大小: 14.9 KB
  • 大小: 4.5 KB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值