「这是我参与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、符合迪米特原则。
缺点: 虽然类的复杂度降低了,但是压力都落在了中介者身上,从而使得中介者变得庞大,难以维护。
注意事项: 不可以在职责混乱的时候使用。