设计模式之中介模式–房产中介的原理
中介模式
就是大白话中介,出现一个中介解耦其他角色。
用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示的互相引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。
为什么要使用中介模式
尽管将一个系统分割成许多对象会增加复用性,但是对象间互相连接的激增又会降低复用性。因为大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以,对系统的行为进行任何较大的改动就十分困难了。
这是因为多个对象间互相耦合的原因,产生了很多依赖关系,比如
a -> b a依赖b
a -> c a依赖c
a -> d
b -> c
b -> d
他们互相之间有太多的依赖,这就是紧耦合。我们需要把他变成一个松耦合的程序,这时候就可以引入中介模式
。
比如在现实中,有很多租户
要找房子
,就需要找房东
,很多租户和房东都有了依赖关系,租户和房东的依赖就很混乱,租户不知道怎么找到好的房东。这时候出现了房产中介
,所有的租户不再需要找房东,只需要找中介
就行了,房东同样不需要找租户,也只需要找中介。
再比如,世界各国之间关系复杂,中国需要找日本,需要找美国等等,后来出现了联合国
,中国只需要找联合国就好了。
但是这样的话,就会出现一个问题,如果中介
出了问题,那么就完蛋了,比如房产中介出问题,那么租户和房东就惨了。如果联合国出问题,那么各国也不好了。
所以,当系统出现多对多关系的时候,先思考是不是设计不合理,如果必须这么设计,在考虑使用中介模式。
这样的话就是把所有的压力给了中介,所以中介一定要做好。
中介的职责:
- 需要知道所有人的信息,比如知道所有租户和房东
- 需要根据这些信息,对租户和房东进行联系
php实现中介模式
先写中介类
/**
* 中介模式
* 中介抽象类
*/
abstract class Mediator{
/**
* 发送消息需要知道消息文本和谁发的
* @param $msg
* @param User $user
*/
abstract function send($msg, User $user);
}
/**
* 中介模式
* 中介抽象类
*/
class Mediate extends Mediator{
public $user1; //用户1
public $user2; //用户2
/**
* 发送消息需要知道消息文本和谁发的
* @param $msg
* @param User $user
*/
function send($msg, User $user) {
//根据发送者告诉接收者,参数也可以多一个接收者
if ($user == $this->user1) {
//.....
}
}
}
有了中介再来两个用户和一个用户父类
/**
* 中介模式
* 用户抽象类
*/
abstract class User{
public $mediator;
/**
* 让用户找到中介
*/
public function __construct(Mediator $mediator) {
$this->mediator = $mediator;
}
}
/**
* 中介模式
* 用户类
*/
class User1 extends User{
public function send($msg) {
$this->mediator->send($msg, $this);
}
}
只需要实现各个知道中介的具体类和一个中介类就可以了。
代码放在了我的github上面。