设计模式十八--中介者模式

定义

用一个中介对象封装一系列对象的交互,终结者使各个对象不需要显示的相互引用,从而使耦合度松散,而且可以独立的改变他们各自的交互方式。

中介者模式的角色

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)

你可能感兴趣的:(设计模式十八--中介者模式)