今天,是设计模式系列篇的最后一篇文章,心情还有点小激动呢:)
What
中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
Why
中介模式的设计思想跟中间层很像,通过引入中介这个中间层,将一组对象之间的交互关系(或者说依赖关系)从多对多(网状关系)转换为一对多(星状关系)。原来一个对象要跟 n 个对象交互,现在只需要跟一个中介对象交互,从而最小化对象之间的交互关系,降低了代码的复杂度,提高了代码的可读性和可维护性。
When
在以下情况下可以使用中介者模式:
- 系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
- 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
- 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象。
- 交互的公共行为,如果需要改变行为则可以增加新的中介者类。
How
中介者模式包含如下角色:
- Mediator: 抽象中介者
- ConcreteMediator: 具体中介者
- Colleague: 抽象同事类
- ConcreteColleague: 具体同事类
今天,我们就使用中介者模式来实现一个聊天室系统。聊天室内用户可以发送文本消息,发送的文本消息对所有用户可见。借助中介者,用户可以把消息先发送给中介者,然后再由中介者发送给聊天室内的其他用户。
代码如下:
首先是,聊天室类,即中介者类。
public abstract class AbstractChatRoom {
protected List<Member> memberList;
public AbstractChatRoom() {
this.memberList = new ArrayList<>();
}
public void register(Member member) {
this.memberList.add(member);
}
public abstract void sendText(Member fromMember, String txt);
}
public class NormalChatRoom extends AbstractChatRoom {
public NormalChatRoom() {
super();
}
@Override
public void sendText(Member fromMember, String txt) {
// 遍历用户列表,接收消息
for (Member member : this.memberList) {
if (member == fromMember) {
continue;
}
member.receiveText(fromMember, txt);
}
}
}
接下来是,用户类,即同事类。
public abstract class Member {
protected String nickName;
protected AbstractChatRoom chatRoom;
public Member(String nickName, AbstractChatRoom chatRoom) {
this.nickName = nickName;
this.chatRoom = chatRoom;
chatRoom.register(this); // 直接调用注册方法,将用户对象添加至聊天室用户列表中。
}
public String getNickName() {
return nickName;
}
public abstract void sendText(String txt);
public abstract void receiveText(Member from, String txt);
}
public class NormalMember extends Member {
public NormalMember(String nickName, AbstractChatRoom chatRoom) {
super(nickName, chatRoom);
}
@Override
public void sendText(String txt) {
this.chatRoom.sendText(this, txt); // 调用中介者,发送消息
}
@Override
public void receiveText(Member fromMember, String txt) {
System.out.println(String.format("%s receive a message from %s: %s", getNickName(), fromMember.getNickName(), txt));
}
}
最后,建立一个聊天室,大家寒暄一下。
public class TestMain {
public static void main(String[] args) {
AbstractChatRoom chatRoom = new NormalChatRoom();
Member member1 = new NormalMember("Jeremy", chatRoom);
Member member2 = new NormalMember("Tom", chatRoom);
Member member3 = new NormalMember("Amy", chatRoom);
member1.sendText("hello every one!");
member2.sendText("hi, how are you?");
member3.sendText("hi, guys!");
}
}
寒暄内容为:
Tom receive a message from Jeremy: hello every one!
Amy receive a message from Jeremy: hello every one!
Jeremy receive a message from Tom: hi, how are you?
Amy receive a message from Tom: hi, how are you?
Jeremy receive a message from Amy: hi, guys!
Tom receive a message from Amy: hi, guys!
代码地址
写在最后
如果你觉得我写的文章帮到了你,欢迎点赞、评论、分享、赞赏哦,你们的鼓励是我不断创作的动力~
网友评论