<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 中介者設計模式 > 原文: [https://howtodoinjava.com/design-patterns/behavioral/mediator-pattern/](https://howtodoinjava.com/design-patterns/behavioral/mediator-pattern/) 根據 GoF 定義,**中介者模式**定義了一個對象,[封裝了](https://howtodoinjava.com/oops/encapsulation-in-java-and-its-relation-with-abstraction/)一組對象如何交互。 中介者通過防止對象之間顯式地相互引用來促進松散耦合,并且它使我們可以獨立地更改其交互。 中介者是**行為型設計模式**,也是 GoF 討論的[其他 23 個模式](https://howtodoinjava.com/gang-of-four-java-design-patterns/)之一。 ## 1.何時使用中介者設計模式 中介者有助于在對象之間建立**松耦合通信**,并有助于減少彼此之間的直接引用。 這有助于最大程度地減少依賴管理和參與對象之間的通信的復雜性。 中介者以**對象不知道其他對象**存在的方式幫助促進對象之間的交互。 對象僅依賴于單個中介者類,而不耦合到許多其他對象。 在設計問題的解決方案期間,如果遇到多個對象需要相互交互以處理請求,但直接通信可能會創建復雜系統的情況,則可以考慮使用中介者模式。 該模式使您可以將類之間的所有關系提取到單獨的類中,從而將對特定組件的任何更改與其余組件隔離。 ## 2.中介者模式的真實示例 * 現實世界中很好的中介者模式示例是機場的“交通管制室”。 如果所有航班都必須進行交互以查找下一個要降落的航班,則會造成很大的混亂。 相反,航班只會將其狀態發送給塔樓。 這些塔依次發送信號,以確認哪架飛機可以起飛或著陸。 我們必須注意,這些塔無法控制整個飛行。 它們僅在終端區域實現約束。 * 中介者模式的另一個很好的例子是**聊天應用**。 在聊天應用中,我們可以有多個參與者。 將每個參與者連接到所有其他參與者不是一個好主意,因為連接數量確實很高。 最好的解決方案是建立一個所有參與者都可以連接的集線器。 該中心只是中介者類。 * 在 Java 編程中,[`java.util.concurrent.Executor`](https://howtodoinjava.com/java/multi-threading/executor-framework-tutorial/)接口內部的`execute()`方法遵循此模式。 `java.util.Timer`類的各種`schedule()`方法的不同重載版本也可以視為遵循此模式。 ## 3.中介者設計模式 此模式定義了一個單獨的(中介)對象,該對象封裝了一組對象之間的交互,并且這些對象將其交互委托給中介對象,而不是直接彼此交互。 #### 3.1 架構 ![Mediator design pattern](https://img.kancloud.cn/51/a9/51a9a3426b2dfc892db4f4674c7ad2b2_634x192.png) 中介者設計模式 圖片來源 – [Wikipedia](https://en.wikipedia.org/wiki/Mediator_pattern) #### 3.2 設計參與者 * **`Mediator`** – 定義`Colleague`對象之間的通信接口 * **`ConcreteMediator`** – 實現`Mediator`接口并協調`Colleague`對象之間的通信。 **它了解所有同事及其在互通方面的目的**。 * **`Colleague`** – 定義了通過`Mediator`與其他同事進行交流的接口 * **`ConcreteColleague`** – 實現`Colleague`接口并通過其`Mediator`與其他同事進行通信 ## 4.中介者設計模式示例 在此 **Java 中介者模式示例**中,我們模擬了聊天應用,用戶可以在其中以一對一的方式向其他用戶發送消息。 必須向所有聊天應用注冊所有用戶才能發送或接收消息。 **中介者接口** ```java public interface IChatRoom { public void sendMessage(String msg, String userId); void addUser(User user); } ``` **具體中介者** ```java import java.util.HashMap; import java.util.Map; public class ChatRoom implements IChatRoom { private Map<String, User> usersMap = new HashMap<>(); @Override public void sendMessage(String msg, String userId) { User u = usersMap.get(userId); u.receive(msg); } @Override public void addUser(User user) { this.usersMap.put(user.getId(), user); } } ``` **同事類** ```java public abstract class User { private IChatRoom mediator; private String id; private String name; public User(IChatRoom room, String id, String name){ this.mediator = room; this.name = name; this.id = id; } public abstract void send(String msg, String userId); public abstract void receive(String msg); public IChatRoom getMediator() { return mediator; } public String getId() { return id; } public String getName() { return name; } } ``` **具體同事** ```java public class ChatUser extends User { public ChatUser(IChatRoom room, String id, String name) { super(room, id, name); } @Override public void send(String msg, String userId) { System.out.println(this.getName() + " :: Sending Message : " + msg); getMediator().sendMessage(msg, userId); } @Override public void receive(String msg) { System.out.println(this.getName() + " :: Received Message : " + msg); } } ``` 測試中介者模式。 ```java public class Main { public static void main(String[] args) { IChatRoom chatroom = new ChatRoom(); User user1 = new ChatUser(chatroom,"1", "Alex"); User user2 = new ChatUser(chatroom,"2", "Brian"); User user3 = new ChatUser(chatroom,"3", "Charles"); User user4 = new ChatUser(chatroom,"4", "David"); chatroom.addUser(user1); chatroom.addUser(user2); chatroom.addUser(user3); chatroom.addUser(user4); user1.send("Hello brian", "2"); user2.send("Hey buddy", "1"); } } ``` 程序輸出。 ```java Alex :: Sending Message : Hello brian Brian :: Received Message : Hello brian Brian :: Sending Message : Hey buddy Alex :: Received Message : Hey buddy ``` ## 5.常見問題 * **中介者模式的優勢** 使用中介者模式,我們可以減少系統中對象之間的通信復雜性。 它促進了松耦合,并減少了系統中子類的數量。 中介者幫助將“多對多”關系替換為“一對多”關系,因此更易于閱讀和理解。 而且由于通信的集中控制,維護變得容易。 * **中介者模式的缺陷** 如果您在中介對象中添加太多邏輯,其架構可能會變得復雜。 不適當使用中介者模式可能會導致“[上帝類](https://en.wikipedia.org/wiki/God_object)”反模式。 * **中介者模式 VS 外觀模式** 中介者模式可以看作是復用的[外觀模式](https://howtodoinjava.com/design-patterns/structural/facade-design-pattern/)。 在中介者中,不是在單個對象的接口上工作,而是在多個對象之間創建多路復用的接口以提供平滑的過渡。 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看