中介者模式
介绍
意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
何时使用:多个类相互耦合,形成了网状结构。
优点:
- 降低了类的复杂度,将一对多转化成了一对一。
- 各个类之间的解耦。
- 符合迪米特原则。
缺点:中介者会庞大,变得复杂难以维护。
使用场景:
- 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
- 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
实现
类的组成
- Mediator(抽象中介者):抽象中介者定义了参与者的交互方式。在此接口或抽象类中声明的操作与场景相关。
- ConcreteMediator(具体中介者):它实现了中介者声明的操作。
- Colleague(抽象同事角色):这是一个抽象类或接口,用于定义需要调节的参与者如何进行交互。
- ConcreteColleague(具体同事角色):这是实现Colleague接口的具体类。
UML图
代码
中介者
public interface ChatRoom {
void showMessage(User user, String message);
}
public class ChatRoomImpl implements ChatRoom {
public void showMessage(User user, String message){
System.out.println(new Date().toString()
+ " [" + user.getName() +"] : " + message);
}
}
同事角色类
public abstract class User {
protected String name;
private ChatRoomImpl chatRoom = new ChatRoomImpl();
public User(String name) {
this.name = name;
}
public abstract String getName();
public void setName(String name) {
this.name = name;
}
public void sendMessage(String message){
chatRoom.showMessage(this,message);
}
}
public class Admin extends User {
public Admin(String name) {
super(name);
}
@Override
public String getName() {
return "Admin-" + name;
}
}
public class Client extends User {
public Client(String name) {
super(name);
}
@Override
public String getName() {
return "Client-" + name;
}
}
public class Main {
public static void main(String[] args) {
Client robert = new Client("Robert");
Client john = new Client("John");
Admin tom = new Admin("Tom");
robert.sendMessage("Hi! John!");
john.sendMessage("Hello! Robert!");
tom.sendMessage("Welcome!");
}
}