一、中介者模式概述
中介者模式定义:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式。(对象行为型模式)
- 中介者模式的优缺点:
- 优点:
- 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>();@Overridepublic void register(Colleague colleague) {// TODO Auto-generated method stubif (!colleagues.contains(colleague)) {colleagues.add(colleague);colleague.setMediator(this);}}@Overridepublic void operation(Colleague colleague) {// TODO Auto-generated method stubfor (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 {@Overridepublic void receive() {// TODO Auto-generated method stubSystem.out.println("具体同事类 ConcreteColleague1 接收请求");}@Overridepublic void send() {// TODO Auto-generated method stubSystem.out.println("具体同事类 ConcreteColleague1 发送请求");/*中介者进行转发*/mediator.operation(this);}}
package Mediator.example;
//具体同事类2
public class ConcreteColleague2 extends Colleague {@Overridepublic void receive() {// TODO Auto-generated method stubSystem.out.println("具体同事类 ConcreteColleague2 接收到请求");}@Overridepublic void send() {// TODO Auto-generated method stubSystem.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();}
}