[一天一个设计模式]-[中介者模式]
中介者模式(Mediator Pattern)定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
与代理模式的区别,代理模式主要是代理某一类对象,中介模式是中介了一组对象,代理模式主要是控制真实对象的访问,中介模式主要是将调用者和被调用者解耦
中介者模式包含以下主要角色。
- 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
- 具体中介者(ConcreteMediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
- 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
- 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
举个栗子,qq群聊,qq就相当于中介者,群成员就是同事类
interface QqMediator{
void register(User user);
void showMessage(User user,String msg);
}
class QqMediatorImpl implements QqMediator{
List<User> users = new ArrayList<>();
@Override
public void register(User user){
users.add(user);
user.setMediator(this);
}
@Override
public void showMessage(User user,String msg){
sout(user.getName()+":"+msg);
}
}
interface User{
String getName();
void setMediator(QqMediator mediator);
void send(String msg);
}
class UserA implements User{
String name="A";
QqMediator mediator;
@Override
public String getName(){
return this.name;
}
@Override
public void setMediator(QqMediator mediator){
this.mediator = mediator;
}
@Override
public void send(String msg){
mediator.showMessage(this,msg);
}
}
class UserB implements User{
String name="B";
QqMediator mediator;
@Override
public String getName(){
return this.name;
}
@Override
public void setMediator(QqMediator mediator){
this.mediator = mediator;
}
@Override
public void send(String msg){
mediator.showMessage(this,msg);
}
}
main(){
QqMediator mediator=new QqMediatorImpl();
User a = new UserA();
User b = new UserB();
mediator.register(a);
mediator.register(b);
a.send("I'm A");
b.send("I'm B");
}