设计模式 -- 中介者模式

121 阅读2分钟

「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

含义: 把一些对象交互封装成一个对象,中介者模式能够让各对象不显式地相互引用,这是弱耦合,并且可以独立改变对象之间的交互。中介这个词也不陌生,我们租房子都要去找中介,没错就是这个中介,只是体现在代码中。

下面就拿聊天室举例子吧,聊天室作为中介,实现各个用户之间的交互。

1.抽象中介者

 public abstract class Mediator {
     public abstract void sendMessage(String message, User user);
 }

2.抽象使用者

 public abstract class User {
     protected Mediator mediator;
     
     public User(Mediator mediator) {
         this.mediator = mediator
     }
 }

3.具体中介类

 public class ChatRoom extends Mediator {
 
     private User1 user1;
     private User2 user2;
 
     public void setUser1(User1 user1) {
         this.user1 = user1;
     }
 
     public void setUser2(User2 user2) {
         this.user2 = user2;
     }
 
     @Override
     public void send(String message, User user) {
         if(user == user1) {
             user2.notify(message);
         } else {
             user1.notify(message);
         }
     }
 
 }

4.具体用户类

 public class User1 extends User {
 
     public User1(Mediator mediator) {
         super(mediator);
     }
 
     public void send(String message) {
         mediator.send(message, this);
     }
 
     public void notify(String message) {
         System.out.println("用户1收到来自聊天室的消息:" + message);
     }
 }
 
 public class User2 extends User {
 
     public User2(Mediator mediator) {
         super(mediator);
     }
 
     public void send(String message) {
         mediator.send(message, this);
     }
 
     public void notify(String message) {
         System.out.println("用户2收到来自聊天室的消息:" + message);
     }
 }

5.测试

 public class Test {
 
     public static void main(String[] args) {
         ChatRoom chatRoom = new ChatRoom();
 
         User1 user1 = new User1(mediator);
         User2 user2 = new User2(mediator);
         
         mediator.setUser1(user1);
         mediator.setUser2(user2);
 
         user1.send("用户1发送消息到聊天室.");
         user2.send("用户2发送消息到聊天室.");
     }
 
 }

6.结果

 用户2收到来自聊天室的消息:用户1发送消息到聊天室.
 用户1收到来自聊天室的消息:用户2发送消息到聊天室.

优点: 1、大大降低了类的复杂度。 2、减少类与类之间的依赖,降低了代码之间的耦合性。 3、符合迪米特原则。

缺点: 虽然类的复杂度降低了,但是压力都落在了中介者身上,从而使得中介者变得庞大,难以维护。

注意事项: 不可以在职责混乱的时候使用。