【设计模式-行为型】调停者模式
一、什么是调停者模式
接下来是调停者模式,还是那个思路,我们从经典电影中来举个例子吧,下面有请调停者大师-----《金钱帝国》中的 徐乐功(梁家辉饰演)。该片是讲诉香港廉政公署成立前,黑社会及警察之间的一些幕后交易。其中有一个情结英国政府派出得力干将决定整治香港乱象,这个经典台词就是在老外上任第一天的情景。来上台词
《金钱帝国》-徐乐功经典台词:
“乐哥,我听说那老外很拽啊!”
“呵呵,我家的狗旺财也很拽呀,它见人就咬就是不咬我!为什么?我养它嘛~哈哈”
“喂,究竟那个老外他是收钱还是不收钱?”
“我现在不敢问!”
“会有猫不吃鱼嘛?恩?我没当探长的时候,保护费都是乱收的。全香港警察都可以收钱,每条街上有几十家地下赌场和妓院,天天打架,破案率低的吓死人!自从我认识了猪油仔,我们俩一起订立规矩,统一收钱。局长收三成,我们这些探长收两成,其余全香港的警察分享三成半,限定每条街地下妓院和赌场的数量,让所有妓女都招到客,地下赌场都有生意做,那些混混有钱赚就不会打架咯!我们的破案率是有史以来最高的!我就不信这个老外敢破坏规矩。如果再搞到天天砍人,尸横遍野的时候,我看他怎么负这个责!”
这句台词充分体现了徐乐功作为调停者的角色,他通过重新分配资源和制定规则,维持了“香港警界和黑社会的秩序”。这种模式不仅减少了内部的混乱和冲突,还提高了整体的效率和稳定性,调停者模式是一种行为型设计模式,通过引入一个调停者对象来集中处理一组对象之间的交互。这种模式的目标是减少对象之间的直接通信。
二、为什么使用调停者模式
-
复杂的交互关系:在电影中,香港警界和黑社会之间存在着复杂的利益关系和频繁的交互。如果没有一个统一的协调者,这些关系很容易变得混乱,导致内部冲突和效率低下。
-
集中管理:徐乐功通过制定规则和重新分配资源,集中管理了警界和黑社会的交互。这种集中管理的方式使得复杂的交互关系变得有序,减少了直接的冲突和混乱。
-
动态变化的交互:当外部环境发生变化(如新的探长上任)时,徐乐功可以通过调整规则和资源分配来应对变化,而不需要改变整个系统的结构。
-
简化对象关系:调停者模式将多对多的交互关系转化为一对多的交互关系,使得对象之间的关系更容易理解和实现。各部门和黑社会中间人只需要与徐乐功交互,而不需要与其他对象直接交互。
三、调停者模式示例
1. 定义同事接口(Colleague)(需要被调停的人的统一行为)
public interface Colleague {
void setMediator(Mediator mediator);
void receiveMessage(String message);
}
2. 实现具体同事类(ConcreteColleague) (具体要被调停的人、警察、黑帮等)
public class PoliceDepartment implements Colleague {
private Mediator mediator;
private String name;
public PoliceDepartment(String name) {
this.name = name;
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void receiveMessage(String message) {
System.out.println(name + " 收到消息: " + message);
}
public void requestResource(String resource) {
mediator.requestResource(this, resource);
}
public void enforceOrder() {
System.out.println(name + " 维持秩序,确保破案率提高。");
}
}
public class BlackMarket implements Colleague {
private Mediator mediator;
private String name;
public BlackMarket(String name) {
this.name = name;
}
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void receiveMessage(String message) {
System.out.println(name + " 收到消息: " + message);
}
public void requestResource(String resource) {
mediator.requestResource(this, resource);
}
public void provideProtectionFee() {
System.out.println(name + " 提供保护费,确保黑市稳定。");
}
}
3. 定义调停者接口(Mediator) (调停者的行为)
public interface Mediator {
void requestResource(Colleague colleague, String resource);
}
4. 实现具体调停者类(ConcreteMediator)(徐乐功)
public class PoliceMediator implements Mediator {
private PoliceDepartment policeDepartment;
private BlackMarket blackMarket;
public void setPoliceDepartment(PoliceDepartment policeDepartment) {
this.policeDepartment = policeDepartment;
}
public void setBlackMarket(BlackMarket blackMarket) {
this.blackMarket = blackMarket;
}
@Override
public void requestResource(Colleague colleague, String resource) {
if (colleague == policeDepartment) {
if (resource.equals("保护费")) {
blackMarket.receiveMessage("警察局请求保护费。");
blackMarket.provideProtectionFee();
}
} else if (colleague == blackMarket) {
if (resource.equals("保护费")) {
policeDepartment.receiveMessage("黑市提供保护费。");
policeDepartment.enforceOrder();
}
}
}
}
5、调停场景重现
public class Main {
public static void main(String[] args) {
// 创建具体同事对象
PoliceDepartment policeDepartment = new PoliceDepartment("警察局");
BlackMarket blackMarket = new BlackMarket("黑市");
// 创建具体调停者对象
PoliceMediator mediator = new PoliceMediator();
// 设置调停者
policeDepartment.setMediator(mediator);
blackMarket.setMediator(mediator);
// 设置同事对象
mediator.setPoliceDepartment(policeDepartment);
mediator.setBlackMarket(blackMarket);
// 请求资源
policeDepartment.requestResource("保护费");
}
}
//输出
黑市 收到消息: 警察局请求保护费。
黑市 提供保护费,确保黑市稳定。
警察局 收到消息: 黑市提供保护费。
警察局 维持秩序,确保破案率提高。