詳細(xì)介紹
????????中介者模式(Mediator Pattern)是一種行為設(shè)計(jì)模式,它通過定義一個(gè)中介類來封裝多個(gè)對(duì)象之間的交互,使各對(duì)象不需要顯示地相互引用,從而降低耦合度,提高系統(tǒng)的可維護(hù)性和靈活性。中介者模式將原本一對(duì)多的網(wǎng)狀關(guān)系轉(zhuǎn)變?yōu)橐粚?duì)多的關(guān)系,即每個(gè)對(duì)象只與中介者對(duì)象通信,而中介者負(fù)責(zé)將消息轉(zhuǎn)發(fā)給正確的對(duì)象,從而實(shí)現(xiàn)對(duì)象之間的解耦。?
核心組件:
- Mediator(中介者):定義一個(gè)接口,用于聲明所有同事對(duì)象需要調(diào)用的中介方法。
- ConcreteMediator(具體中介者):具體實(shí)現(xiàn)中介者接口,協(xié)調(diào)各個(gè)同事對(duì)象的交互,維持同事對(duì)象間的松耦合關(guān)系。
- Colleague(同事):定義一個(gè)接口,聲明同事對(duì)象所知道的中介者。每個(gè)同事只知道中介者而不知道其他同事的存在。
- ConcreteColleague(具體同事):實(shí)現(xiàn)同事接口,實(shí)現(xiàn)自身業(yè)務(wù)邏輯,并通過中介者與其他同事通信。
使用場(chǎng)景
- 多個(gè)對(duì)象間存在復(fù)雜的相互依賴關(guān)系:當(dāng)多個(gè)對(duì)象之間的直接交互復(fù)雜且難以管理時(shí),可以使用中介者模式來簡(jiǎn)化對(duì)象間的通信。
- 需要降低對(duì)象間的耦合度:通過引入中介者,可以避免對(duì)象間的直接引用,從而降低系統(tǒng)的耦合度。
- 需要集中控制交互:當(dāng)需要對(duì)一組對(duì)象的交互進(jìn)行集中管理時(shí),中介者模式可以提供一個(gè)中心控制點(diǎn)。
注意事項(xiàng)
- 中介者不應(yīng)知道所有同事的詳細(xì)信息:中介者應(yīng)該只了解它需要協(xié)調(diào)的交互細(xì)節(jié),而不必知道同事的具體實(shí)現(xiàn)。
- 避免過度集中:過度集中所有的交互到一個(gè)中介者可能會(huì)導(dǎo)致中介者本身變得過于復(fù)雜,考慮使用多個(gè)中介者來分解復(fù)雜性。
- 性能考量:中介者作為消息的中轉(zhuǎn)站,頻繁的調(diào)用可能會(huì)成為性能瓶頸,需注意優(yōu)化。
優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
- 降低耦合度:同事之間不直接通信,減少了相互依賴。
- 簡(jiǎn)化對(duì)象間通信:通過中介者統(tǒng)一管理交互,簡(jiǎn)化了系統(tǒng)結(jié)構(gòu)。
- 易于維護(hù)和擴(kuò)展:新增或修改同事類時(shí),只需修改中介者即可,不影響其他同事。
缺點(diǎn):
- 中介者可能會(huì)變得復(fù)雜:隨著系統(tǒng)復(fù)雜度增加,中介者可能需要處理越來越多的交互邏輯。
- 不適用簡(jiǎn)單場(chǎng)景:對(duì)于簡(jiǎn)單的對(duì)象交互,引入中介者可能會(huì)造成不必要的復(fù)雜度。
Java代碼示例
假設(shè)有一個(gè)聊天室系統(tǒng),包含用戶(User)和聊天室(ChatRoom)兩種角色。文章來源:http://www.zghlxwxcb.cn/news/detail-861802.html
// 同事接口
interface Colleague {
void receiveMessage(String message, Colleague sender);
void sendMessage(String message);
}
// 具體同事:用戶
class User implements Colleague {
private String name;
private ChatRoom chatRoom;
public User(String name, ChatRoom chatRoom) {
this.name = name;
this.chatRoom = chatRoom;
}
@Override
public void receiveMessage(String message, Colleague sender) {
System.out.println(name + " received message from " + ((User)sender).getName() + ": " + message);
}
@Override
public void sendMessage(String message) {
chatRoom.sendMessage(this, message);
}
public String getName() {
return name;
}
}
// 中介者:聊天室
class ChatRoom implements Mediator {
@Override
public void sendMessage(Colleague sender, String message) {
for (Colleague colleague : users) {
if (!colleague.equals(sender)) {
colleague.receiveMessage(message, sender);
}
}
}
private List<Colleague> users = new ArrayList<>();
public void addUser(User user) {
users.add(user);
}
}
// 使用示例
public class MediatorPatternDemo {
public static void main(String[] args) {
ChatRoom chatRoom = new ChatRoom();
User john = new User("John", chatRoom);
User jane = new User("Jane", chatRoom);
chatRoom.addUser(john);
chatRoom.addUser(jane);
john.sendMessage("Hello, Jane!");
jane.sendMessage("Hi, John! How are you?");
}
}
使用過程中可能遇到的問題
- 中介者過于龐大:當(dāng)中介者變得龐大和復(fù)雜時(shí),可以考慮分解為多個(gè)小的中介者,或者引入更多的抽象層次。
- 過度集中控制:為了減少中介者負(fù)擔(dān),可以適當(dāng)讓一些簡(jiǎn)單的交互直接在同事間發(fā)生,僅將復(fù)雜的交互邏輯委托給中介者處理。
與其他模式的對(duì)比
- 與觀察者模式:兩者都涉及對(duì)象間的通信,但觀察者模式強(qiáng)調(diào)一對(duì)多的發(fā)布-訂閱機(jī)制,而中介者模式更側(cè)重于簡(jiǎn)化對(duì)象間的直接通信,控制復(fù)雜交互。
- 與外觀模式:外觀模式為子系統(tǒng)提供一個(gè)統(tǒng)一的接口,隱藏子系統(tǒng)的復(fù)雜性;而中介者模式關(guān)注于協(xié)調(diào)一組對(duì)象之間的交互,降低它們之間的耦合度。
- 與策略模式:策略模式關(guān)注于定義一系列算法,并在運(yùn)行時(shí)選擇其中一個(gè)算法執(zhí)行。雖然兩者都實(shí)現(xiàn)了行為的封裝,但中介者模式更側(cè)重于管理對(duì)象間的交互,而不是算法的替換。
文章來源地址http://www.zghlxwxcb.cn/news/detail-861802.html
到了這里,關(guān)于設(shè)計(jì)模式之中介者模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!