携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情
1.意图:
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
2.适用性:
- 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
- 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
- 想定制一个分布在多个类中的行为,而又不想生成太多的子类。
3.中介者(Mediator)模式的构成:
- 抽象中介者(Mediator):定义一个接口用于各个同事对象(Colleague)之间通信
- 具体中介者(ConcreteMediator):协调各个同事对象实现协作的行为,掌握并且维护它的各个同事对象的引用
- 同事类(Colleague):每一个同事类都引用一个中介者对象,每一个同事对象在需要和其他同事对象通信时,就与它的中介者通信
4.中介者模式UML类图:
5.中介者模式UML序列图:
6.代码示例:
中介者接口:
public interface IChatroom {
void register(Participant participant);
void send(String from, String to, String message);
}
具体中介者——聊天室类:
public class Chatroom implements IChatroom {
private Hashtable participants = new Hashtable();
@Override
public void register(Participant participant) {
if (null == participants.get(participant.name)) {
participants.put(participant.name, participant);
participant.setChatroom(this);
}
}
@Override
public void send(String from, String to, String message) {
Participant participant = (Participant) participants.get(to);
if (null != participant) {
participant.receive(from, message);
}
}
}
同事类父类:
public class Participant {
private Chatroom chatroom;
public String name;
public Participant(String name) {
this.name = name;
}
public Chatroom getChatroom() {
return chatroom;
}
public void setChatroom(Chatroom chatroom) {
this.chatroom = chatroom;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void send(String to, String message) {
chatroom.send(name, to, message);
}
public void receive(String from, String message) {
System.out.println(from + " to " + this.name + " : " + message);
}
}
具体同事类:
public class ConcreteParticipantA extends Participant {
public ConcreteParticipantA(String name) {
super(name);
}
@Override
public void receive(String from, String message) {
super.receive(from, message);
System.out.println("To ConcreteParticipantA:");
}
}
```java
public class ConcreteParticipantB extends Participant {
public ConcreteParticipantB(String name) {
super(name);
}
@Override
public void receive(String from, String message) {
System.out.println("To ConcreteParticipantB");
super.receive(from, message);
}
}
客户端:
public class Client {
public static void main(String[] args) {
Chatroom chatroom = new Chatroom();
Participant zhangsan = new ConcreteParticipantA("zhangsan");
Participant lisi = new ConcreteParticipantA("lisi");
Participant wangwu = new ConcreteParticipantB("wangwu");
chatroom.register(zhangsan);
chatroom.register(lisi);
chatroom.register(wangwu);
zhangsan.send("lisi", "hello 你好");
lisi.send("wangwu", "world 世界");
wangwu.send("zhangsan", "hello world");
}
}