面向对象的洗礼:设计模式(二十五)之中介模式
中介模式,是非常非常常见的一种设计模式。一般应用于一组对象以定义良好但是复杂的方式进行通信的场合。定制一个分布在多个类中的行为,而不像生成太多的子类。这是中介模式的应用场景。
中介模式的优点:中介类的集中化控制。
中介模式的缺点:中介类的集中化控制。
中介模式的中介类,集中化控制了所有的对象,减少了请求者和响应者的耦合。把中介封装在一个对象中,注意力从关注对象本身变成了关注它们之间的交互,更加宏观。缺点也就显而易见,因为集中化的控制,使得中介类越发的庞大,不易维护。
场景:中介抽象类联合国,中介具体类安理会。成员抽象类为国家,成员具体类为美国和伊拉克。以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('我们没有和武器!');