一、中介者模式概述
中介者模式定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式。(对象行为型模式)
- 中介者模式的优缺点:
- 优点:
- 1.简化了对象之间的交互;
- 2.将各同事解耦;
- 3.减少子类生成;
- 4.可以简化各同事类的设计和实现。
- 缺点:
- 在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
- 优点:
- 适用环境:
- 1.系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解;
- 2.一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象;
- 3.想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的中介者类
- 4.我们所常知道的MVC模式中,controller就是我们所谓的中介者。
二、代码实现
中介者模式主要包含4个角色:
- Mediator: 抽象中介者,是中介者的接口/抽象类;
- ConcreteMediator: 具体中介者,中介者的具体实现,实现中介者接口,定义一个List来管理Colleague对象;
- Colleague: 抽象同事类,定义同事类的接口/抽象类,保存中介者对象,实现同事类的公共方法;
- ConcreteColleague: 具体同事类,实现抽象同事类。通过中介者间接完成具体同事类之间的通信交互。
2.1 抽象中介者(Mediator)
package Mediator.example;
//抽象中介者
public abstract class Mediator {
/**注册同事类*/
public abstract void register(Colleague colleague);
/**处理接收逻辑*/
public abstract void operation(Colleague colleague);
}
2.2 具体中介者(ConcreteMediator)
package Mediator.example;
import java.util.List;
import java.util.ArrayList;
//具体中介者类
public class ConcreteMediator extends Mediator {
private List<Colleague> colleagues = new ArrayList<Colleague>();
@Override
public void register(Colleague colleague) {
// TODO Auto-generated method stub
if (!colleagues.contains(colleague)) {
colleagues.add(colleague);
colleague.setMediator(this);
}
}
@Override
public void operation(Colleague colleague) {
// TODO Auto-generated method stub
for (Colleague coll : colleagues) {
if (!coll.equals(colleague)) {
coll.receive();
}
}
}
}
2.3 抽象同事类(Colleague)
package Mediator.example;
//抽象同事类
public abstract class Colleague {
protected Mediator mediator;
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public abstract void receive();
public abstract void send();
}
2.4 具体同事类(ConcreteColleague1、ConcreteColleague2)
package Mediator.example;
//具体同事类1
public class ConcreteColleague1 extends Colleague {
@Override
public void receive() {
// TODO Auto-generated method stub
System.out.println("具体同事类 ConcreteColleague1 接收请求");
}
@Override
public void send() {
// TODO Auto-generated method stub
System.out.println("具体同事类 ConcreteColleague1 发送请求");
/*中介者进行转发*/
mediator.operation(this);
}
}
package Mediator.example;
//具体同事类2
public class ConcreteColleague2 extends Colleague {
@Override
public void receive() {
// TODO Auto-generated method stub
System.out.println("具体同事类 ConcreteColleague2 接收到请求");
}
@Override
public void send() {
// TODO Auto-generated method stub
System.out.println("具体同事类 ConcreteColleague2 发送请求");
mediator.operation(this);
}
}
2.5 客户端(Client)
package Mediator.example;
public class Client {
public static void main(String[] args) {
Mediator concreteMediator = new ConcreteMediator();
Colleague concreteColleague1 = new ConcreteColleague1();
Colleague concreteColleague2 = new ConcreteColleague2();
concreteMediator.register(concreteColleague1);
concreteMediator.register(concreteColleague2);
concreteColleague1.send();
concreteColleague2.send();
}
}