定义
用一个中介对象封装一系列对象的交互,终结者使各个对象不需要显示的相互引用,从而使耦合度松散,而且可以独立的改变他们各自的交互方式。
中介者模式的角色
1:抽象中介者(Mediator)
该角色定义出同事对象到中介者之间的统一接口,用于各同事之间的通信。
public abstract class Mediator{
public abstract void colleagueChanged(Colleague c);
}
2:具体中介者(ConcreateMediator)
该角色实现抽象中介者,它依赖于各个同事角色,并通过协调各同事角色实现协作行为。
public class ConcreteMediator extends Mediator{
private ConcretaeColleague c1;
private ConcretaeColleague c2;
public void colleagueChanged(Colleague c){
c1.action();
c2.action();
}
public void createConcreteMediator(){
c1 = new ConcreteColleague(this);
c2 = new ConcreteColleague(this);
}
public ConcreteColleague getc1(){
return c1;
}
public ConcreteColleague getc2(){
return c2;
}
}
3:抽象同事角色(Colleague)
该角色定义出中介者到同事之间的接口,同事对象只知道中介者而不知道其余的同事对象。
public abstract class Colleague{
private Mediator mediator;
public Colleague(Mediator mediator){
this.mediator = mediator;
}
public Mediator getMediator{
return this.mediator;
}
public void setMediator(Mediator mediator){
this.mediator = mediator;
}
//调用此方法改变自身的状态
public void change(){
this.mediator.colleagueChanged(this);
}
//抽象行动,子类实现
public abstract void action();
}
4:具体同事(ConcreateColleague)
该角色实现同事类,每个具体同事类都清楚自己小范围块的行为,而不知道大范围的目的。
//第一个同事
public class ConcreteColleague1 extends Colleague{
public ConcreteColleague1(Mediator mediator){
super(mediator);
}
@Override
public void action(){
System.out.println("action1 !");
}
}
//第二个同事
public class ConcreteColleague2 extends Colleague{
public ConcreteColleague2(Mediator mediator){
super(mediator);
}
@Override
public void action(){
System.out.println("action2 !");
}
}
优点
1:减少类之间的依赖,将原有一对多的关系变成一对一的依赖,使得对象之间的关系容易维护。
2:避免同事对象之间过度耦合,同类只依赖于中介者,使同类更容易被复用。
3:中介者模式将对象的协作和行为抽象,将对象在小尺度行为上与其他对象的相互作用分开处理。
缺点
1:中介者模式降低了同事类之间的复杂性,但是增加了中介者类的复杂性。
2:中介者经常充满各种具体同事类的关系协调代码,并且代码不能复用。
注意事项
1:不应当在责任划分混乱的时候使用。
2:不应当对数据类和方法类使用。
3:正确理解封装(行为封装)
参考资料:设计模式(java)
网友评论