中介者模式(Mediator)
用一个中介对象来封装一系列的对象交互。中介者是个对象不要显示地互相引用,从而减低耦合,并且可以独立地改变他们之间的交互。
在GoF23种设计模式中,属于行为型模式( Behavioral Patterns)
。
中介者模式提供了一个公有的交互平台,将平台使用者的共性部分集成到平台中,减少了使用者所承担的责任,在系统层面优化了交互关系,降低系统的复杂度。
- 优点
- 将协作抽象化、集中控制
- 简化对象职责,解耦了对象之间的关系
- 缺点
- 提高了系统理解成本
- 使用场景
- 各个对象之间有公共的交互行为时
- 一个对象引用其他很多对象并与这些对象进行直接或间接的通信时
实例
角色说明
- Mediator
- 中介者接口
- ConcreteMediator
- 具体中介者
- 维护它的各个同事相关交互
- Colleague
- 同事接口类
- ConcreteColleague
- 具体同事
- 每个同事类都会知道其中介者,并可以与之通信
举例
我们以班级微信群为例,展示老师在群里通知消息,学生响应的过程。
角色说明
- WxGroup(Mediator)
- 微信群
- Class1WxGroup(ConcreteMediator)
- 1班微信群
- People(Colleague)
- 群员
- Teacher(ConcreteColleague)
- 老师
- Student(ConcreteColleague)
- 学生
- Client
- 微信平台
code
- People.java
public interface People {
void sendWxMessage(WxGroup wxGroup, String message);
}
- Teacher.java
public class Teacher implements People {
private String name;
public Teacher(String name) {
this.name = name;
}
@Override
public void sendWxMessage(WxGroup wxGroup, String message) {
wxGroup.sendMessage(name, message);
}
}
- Student.java
public class Student implements People {
private String name;
public Student(String name) {
this.name = name;
}
@Override
public void sendWxMessage(WxGroup wxGroup, String message) {
wxGroup.sendMessage(name, message);
}
}
- WxGroup.java
public interface WxGroup {
void sendMessage(String name, String message);
}
- Class1WxGroup.java
public class Class1WxGroup implements WxGroup {
@Override
public void sendMessage(String name, String message) {
System.out.println("[1班班级群]" + name + ":\n" + message + "\n");
}
}
- Client.java
public class Client {
public static void main(String[] args) {
Class1WxGroup class1WxGroup = new Class1WxGroup();
People teacherZ = new Teacher("张老师");
People ordin = new Student("ordin");
teacherZ.sendWxMessage(class1WxGroup, "恭喜ordin荣获三好学生!!! [鲜花][掌声]");
ordin.sendWxMessage(class1WxGroup, "谢谢老师[害羞][害羞]");
}
}
- output
[1班班级群]张老师:
恭喜ordin荣获三好学生!!! [鲜花][掌声]
[1班班级群]ordin:
谢谢老师[害羞][害羞]
实例
我们日常使用的redisClient、kafkaClient都属于中介者模式的应用。
通过他们的封装,使得各个应用程序之间有了统一关系的维护者。
总结
中介者模式让分散的关系抽象化,进行统一管理和交互,降低系统复杂性。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处
最后编辑时间为: