设计模式之中介者模式

中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互,使各对象不需要显示地相互引用,从而使其耦合松散,且可以独立地改变它们之间的交互,属于行为型模式。

组成

中介者模式由抽象中介 Mediator 、抽象同事 Colleague 、具体中介 ConcreteMediator 和多个具体同事 ConcreteColleague 组成。

其中 Mediator 定义一个抽象的、将消息发给 Colleague 的方法;Colleague 持有一个 Mediator 的引用,定义抽象的发送、接收消息的方法;ConcreteMediator 实现 Mediator 中定义的发送消息方法,同时持有全部的 Mediator 引用;ConcreteColleague 继承 Colleague,通过持有的 Mediator 引用实现发送、接收消息的抽象方法。

优点

简化同事类 Colleague 的设计和实现。

简化同事类 Colleague 之间的交互,降低其间的解耦性。

缺点

中介者类中包含全部同事类之间的交互细节,可能会导致其非常复杂、难以维护。

使用场景

系统中一组对象以定义良好却复杂的方式进行通信时,可以使用中介者模式。

设计原则

遵循最小知识原则(迪米特法则),违反单一职责原则。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
public interface Mediator {
void send(String message, Colleague colleague);
}

public abstract class Colleague {

protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}

public void receive(String message) {
String receiver = this.getClass().getSimpleName();
System.out.println(receiver + " receive message: " + message);
}

public abstract void send(String message);
}

public class ConcreteColleagueA extends Colleague {

public ConcreteColleagueA(Mediator mediator) {
super(mediator);
}

@Override
public void send(String message) {
this.mediator.send(message, this);
}
}

public class ConcreteColleagueB extends Colleague {

public ConcreteColleagueB(Mediator mediator) {
super(mediator);
}

@Override
public void send(String message) {
this.mediator.send(message, this);
}
}

public class ConcreteMediator implements Mediator {

private ConcreteColleagueA colleagueA;
private ConcreteColleagueB colleagueB;

public void setColleagueA(ConcreteColleagueA colleagueA) {
this.colleagueA = colleagueA;
}

public void setColleagueB(ConcreteColleagueB colleagueB) {
this.colleagueB = colleagueB;
}

@Override
public void send(String message, Colleague colleague) {
if (colleagueA == colleague) {
colleagueB.receive(message);
} else {
colleagueA.receive(message);
}
}
}

public class Client {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();

ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);

mediator.setColleagueA(colleagueA);
mediator.setColleagueB(colleagueB);

colleagueA.send("hello");
colleagueB.send("hi");
}
}
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • © 2016-2020 姜越

谢谢老板

支付宝
微信