LaneBlog

蝼蚁虽小,也有梦想

PHP Socket服务 | PHP微信开发框架 | 开源博客

面向对象的洗礼:设计模式(二十五)之中介模式

Clicks: 2232 Date: 2014-04-30 16:16:47 Power By 李轩Lane

    中介模式,是非常非常常见的一种设计模式。一般应用于一组对象以定义良好但是复杂的方式进行通信的场合。定制一个分布在多个类中的行为,而不像生成太多的子类。这是中介模式的应用场景。
    中介模式的优点:中介类的集中化控制。
    中介模式的缺点:中介类的集中化控制。
    中介模式的中介类,集中化控制了所有的对象,减少了请求者和响应者的耦合。把中介封装在一个对象中,注意力从关注对象本身变成了关注它们之间的交互,更加宏观。缺点也就显而易见,因为集中化的控制,使得中介类越发的庞大,不易维护。
    场景:中介抽象类联合国,中介具体类安理会。成员抽象类为国家,成员具体类为美国和伊拉克。以PHP为代码环境来描述中介模式。
    
<?php
<?php
abstract class UN{
    public function sentMessage($message, $countryObj){}
}
abstract class Country{
    protected $UNObj;
    public function __construct($UNObj){
        $this->UNObj = $UNObj;
    }
}
class US extends Country{
    public function __construct($UNObj){
        parent::__construct($UNObj);
    }
    public function sentMessage($message){
        $this->UNObj->sentMessage($message, $this);
    }
    public function getMessage($message){
        echo '美国收到某国消息:' . $message . '<br>';
    }
}
class Iraq extends Country{
    public function __construct($UNObj){
        parent::__construct($UNObj);
    }
    public function sentMessage($message){
        $this->UNObj->sentMessage($message, $this);
    }
    public function getMessage($message){
        echo '伊拉克收到某国消息:' . $message . '<br>';
    }
}
class UNSC extends UN{
    private $usObj;
    private $iraqObj;
    public function setUsObj($obj){
        $this->usObj = $obj;
    }
    public function setIraqObj($obj){
        $this->iraqObj = $obj;
    }
    public function sentMessage($message, $sentObj){
        if($this->usObj == $sentObj){
            $this->iraqObj->getMessage($message);
        }else{
            $this->usObj->getMessage($message);
        }
    }
}
//客户端/接口
$unsc = new UNSC();
$us = new US($unsc);
$iraq = new Iraq($unsc);
$unsc ->setUsObj($us);
$unsc->setIraqObj($iraq);
$us->sentMessage('你们不可以研发核武器!');
$iraq->sentMessage('我们没有和武器!');
Add Comment
©2014 www.lanecn.com , All rights reserved. Power By Li Xuan.  京ICP备14005030号