中介者模式-Mediator Pattern
中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。
我的理解:以中介者为中心,将一个消息发送给其他的或指定的同事类,抽象中介者中定义一个方法,表示具体中介者需要处理接收到的消息(发送人与消息内容),每个同事类在实例化的时候都需要声明自己的中介者是谁。中介者也要知道是哪个同事类。
中介者模式将一个网状的系统结构变成一个以中介者对象为中心的星形结构,在这个星型结构中,使用中介者对象与其他对象的一对多关系来取代原有对象之间的多对多关系。
例子来自这里 https://www.cnblogs.com/ysw-go/p/5413958.html
● 抽象中介者:它定义一个接口,该接口用于与各同事对象之间进行通信。
● 具体中介者:它是抽象中介者的子类,通过协调各个同事对象来实现协作行为,它维持了对各个同事对象的引用。
● 抽象同事类:它定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时它维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。
● 具体同事类:它是抽象同事类的子类;每一个同事对象在需要和其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;在具体同事类中实现了在抽象同事类中声明的抽象方法。
抽象中介者//抽象中介者类
abstract class Mediator{
abstract void contact(String content,Colleague coll);
}
抽象同事类
abstract class Colleague {
protected String name;
protected Mediator mediator;
public Colleague(String name, Mediator mediator) {
this.name = name;
this.mediator = mediator;
}
}
具体同事类
class ColleagueA extends Colleague {
// 具体同事类继承自Colleague,此刻就可以与中介者mediator进行通信了
public ColleagueA(String name, Mediator mediator) {
super(name, mediator);
}
public void getMessage(String message){
System.out.println("同事A"+name+"获得信息"+message);
}
//同事A与中介者通信
public void contact(String message){
System.out.println("同事A发送消息");
mediator.contact(message, this);
}
}
class ColleagueB extends Colleague {
public ColleagueB(String name, Mediator mediator) {
super(name, mediator);
}
public void getMessage(String message){
System.out.println("同事B"+name+"获得信息"+message);
}
//同事B与中介者通信
public void contact(String message){
System.out.println("同事B发送消息");
mediator.contact(message, this);
}
}
具体中介者
//具体中介者
class ConcreteMediator extends Mediator {
ColleagueA collA;
ColleagueB collB;
public void setCollA(ColleagueA collA) {
this.collA = collA;
}
public void setCollB(ColleagueB collB) {
this.collB = collB;
}
@Override
public void contact(String content, Colleague coll) {
if (coll==collA) {
collB.getMessage(content);
} else {
collA.getMessage(content);
}
}
}
Client
public class Client {
/**
* @param args
*/
// 中介者,ColleagueA、ColleagueB
public static void main(String[] args) {
// 定义中介者
ConcreteMediator mediator = new ConcreteMediator();
// 定义具体同事类
ColleagueA colleagueA = new ColleagueA("张三", mediator);
ColleagueB colleagueB = new ColleagueB("李四", mediator);
// 中介者知晓每一个具体的Colleague类
mediator.setCollA(colleagueA);
mediator.setCollB(colleagueB);
colleagueA.contact("我是A,我要和同事B说说工作的事情");
colleagueB.contact("我是B,我下午有时间,下午商量吧");
}
}