中介者模式Mediator
用一个中介对象来封装一系列的对象交互。中介者使得各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互
Colleague:抽象同事类,持有Mediator引用
ConcreteColleague:具体同事类:每个类只知道自己的行为,彼此互相不认识,但都认识中介者
Mediator:抽象中介者,定义用于同事类之间的通信抽象方法
ConcreteMediator:实现抽象方法,知道所有抽象具体同事类(可使用List),从具体同事类接收消息,在对具体同事发出命令
迪米特原则典型应用
同事类之间关系是十分复杂的,他们相互影响相互依赖一个类变法会影响到其他类,其他类变化也会影响到自己,使得各个类之间呈网状结构,引入中介者为中心,把原来处理对象之间关系的方法放到中介类之中,变为星型结构;
把对象如何进行协作进行抽象成一个中介者类,从关注各个类的各自的行为转移到他们之间如何进行协作上,但由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague 都复杂,中介者十分臃肿,那一管理或者维护
中介者模式
使用场景
用于多对多的对象群
当对象之间存在复杂的网状结构关系而导致依赖关系混乱且难以复用时。
当想创建一个运行于多个类之间的对象,又不想生成新的子类时。
与观察者模式
中介模式
参与者是不同类的类对象(一个类对多个类的多个对象);
双向通知,同事类对象可以通过中介者通知其他同事类
只提供加入同时类引用集的方法
只会影响与自己有协作关系的
一般借由观察者模式实现,同时类即是被观察者又被观察者
观察者模式
观察者模式的参与者是同一个类的类对象(一个类对一个类的多个对象);
一般为单向通知,被观察者通知观察者
提供加入和退出观察者者引用集的方法,不关系列表中有谁
Subject只关心两件事:1.维护这个列表,2.发布事件
实例代码
Colleague
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator){
this.mediator = mediator;
}
public abstract void send(String s);
public abstract void receive(String s);
}
ConcreteColleagueA
public class ConcreteColleagueA extends Colleague {
public ConcreteColleagueA(Mediator mediator) {
super(mediator);
}
@Override
public void send(String s) {
mediator.affect(s,this);
}
@Override
public void receive(String s) {
System.out.println("A对象接收到 "+s);
}
}
ConcreteColleagueB
public class ConcreteColleagueB extends Colleague {
public ConcreteColleagueB(Mediator mediator) {
super(mediator);
}
@Override
public void send(String s) {
mediator.affect(s,this);
}
@Override
public void receive(String s) {
System.out.println("B对象接收到 "+s);
}
}
Mediator:
public interface Mediator {
void affect(String message,Colleague colleague);
}
ConcreteMediator
public class ConcreteMediator implements Mediator{
private ConcreteColleagueA concreteColleagueA;
private ConcreteColleagueB concreteColleagueB;
public void setColleague(ConcreteColleagueA a, ConcreteColleagueB b){
this.concreteColleagueA = a;
this.concreteColleagueB = b;
}
@Override
public void affect(String message, Colleague c) {
if (c == this.concreteColleagueA){
this.concreteColleagueB.receive("A发送的 "+message);
}
else if (c == this.concreteColleagueB){
this.concreteColleagueA.receive("B发送的 "+message);
}
}
}
public class Test {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleagueA a = new ConcreteColleagueA(mediator);
ConcreteColleagueB b = new ConcreteColleagueB(mediator);
mediator.setColleague(a, b);
a.send("你好");
b.send("你也好");
}
}