今天执桌,是設(shè)計(jì)模式系列篇的最后一篇文章,心情還有點(diǎn)小激動呢:)
What
中介者模式(Mediator Pattern),用一個(gè)中介對象來封裝一系列的對象交互误堡,中介者使各對象不需要顯式地相互引用界赔,從而使其耦合松散丢习,而且可以獨(dú)立地改變它們之間的交互。中介者模式又稱為調(diào)停者模式淮悼,它是一種對象行為型模式咐低。
Why
中介模式的設(shè)計(jì)思想跟中間層很像,通過引入中介這個(gè)中間層袜腥,將一組對象之間的交互關(guān)系(或者說依賴關(guān)系)從多對多(網(wǎng)狀關(guān)系)轉(zhuǎn)換為一對多(星狀關(guān)系)见擦。原來一個(gè)對象要跟 n 個(gè)對象交互,現(xiàn)在只需要跟一個(gè)中介對象交互瞧挤,從而最小化對象之間的交互關(guān)系锡宋,降低了代碼的復(fù)雜度,提高了代碼的可讀性和可維護(hù)性特恬。
When
在以下情況下可以使用中介者模式:
- 系統(tǒng)中對象之間存在復(fù)雜的引用關(guān)系执俩,產(chǎn)生的相互依賴關(guān)系結(jié)構(gòu)混亂且難以理解。
- 一個(gè)對象由于引用了其他很多對象并且直接和這些對象通信癌刽,導(dǎo)致難以復(fù)用該對象役首。
- 想通過一個(gè)中間類來封裝多個(gè)類中的行為尝丐,而又不想生成太多的子類『獍拢可以通過引入中介者類來實(shí)現(xiàn)爹袁,在中介者中定義對象。
- 交互的公共行為矮固,如果需要改變行為則可以增加新的中介者類失息。
How
中介者模式包含如下角色:
- Mediator: 抽象中介者
- ConcreteMediator: 具體中介者
- Colleague: 抽象同事類
- ConcreteColleague: 具體同事類
今天,我們就使用中介者模式來實(shí)現(xiàn)一個(gè)聊天室系統(tǒng)档址。聊天室內(nèi)用戶可以發(fā)送文本消息盹兢,發(fā)送的文本消息對所有用戶可見。借助中介者守伸,用戶可以把消息先發(fā)送給中介者绎秒,然后再由中介者發(fā)送給聊天室內(nèi)的其他用戶。
代碼如下:
首先是尼摹,聊天室類见芹,即中介者類。
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); // 直接調(diào)用注冊方法把鉴,將用戶對象添加至聊天室用戶列表中。
}
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); // 調(diào)用中介者儿咱,發(fā)送消息
}
@Override
public void receiveText(Member fromMember, String txt) {
System.out.println(String.format("%s receive a message from %s: %s", getNickName(), fromMember.getNickName(), txt));
}
}
最后,建立一個(gè)聊天室场晶,大家寒暄一下混埠。
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!");
}
}
寒暄內(nèi)容為:
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!
代碼地址
寫在最后
如果你覺得我寫的文章幫到了你,歡迎點(diǎn)贊诗轻、評論钳宪、分享、贊賞哦扳炬,你們的鼓勵是我不斷創(chuàng)作的動力~