中介者设计模式

一、用一个中介者对象封装一系列的对象交互java

  • 中介者使各对象不须要显示地相互做用,从而使耦合松散,并且能够独立地改变它们之间的交互
  • 中介者模式又称为调停者模式

二、为何要使用中介者模式ide

  • 如图,若是对象1变化会引发周边4个对象变化(网状结构)
  • 下图,引入中介者(星状结构)
  • 任何一个类的变更,只会影响的类自己,以及中介者,这样就减少了系统的耦合

abstract class AbstractColleague {  
    protected int number;  
  
    public int getNumber() {  
        return number;  
    }  
  
    public void setNumber(int number){  
        this.number = number;  
    }  
    //注意这里的参数再也不是同事类,而是一个中介者  
    public abstract void setNumber(int number, AbstractMediator am);  
}  
  
class ColleagueA extends AbstractColleague{  
  
    public void setNumber(int number, AbstractMediator am) {  
        this.number = number;  
        am.AaffectB();  
    }  
}  
  
class ColleagueB extends AbstractColleague{  
  
    @Override  
    public void setNumber(int number, AbstractMediator am) {  
        this.number = number;  
        am.BaffectA();  
    }  
}  
  
abstract class AbstractMediator {  
    protected AbstractColleague A;  
    protected AbstractColleague B;  
      
    public AbstractMediator(AbstractColleague a, AbstractColleague b) {  
        A = a;  
        B = b;  
    }  
  
    public abstract void AaffectB();  
      
    public abstract void BaffectA();  
  
}  
class Mediator extends AbstractMediator {  
  
    public Mediator(AbstractColleague a, AbstractColleague b) {  
        super(a, b);  
    }  
  
    //处理A对B的影响  
    public void AaffectB() {  
        int number = A.getNumber();  
        B.setNumber(number*100);  
    }  
  
    //处理B对A的影响  
    public void BaffectA() {  
        int number = B.getNumber();  
        A.setNumber(number/100);  
    }  
}  
  
public class Client {  
    public static void main(String[] args){  
        AbstractColleague collA = new ColleagueA();  
        AbstractColleague collB = new ColleagueB();  
          
        AbstractMediator am = new Mediator(collA, collB);  
          
        System.out.println("==========经过设置A影响B==========");  
        collA.setNumber(1000, am);  
        System.out.println("collA的number值为:"+collA.getNumber());  
        System.out.println("collB的number值为A的10倍:"+collB.getNumber());  
  
        System.out.println("==========经过设置B影响A==========");  
        collB.setNumber(1000, am);  
        System.out.println("collB的number值为:"+collB.getNumber());  
        System.out.println("collA的number值为B的0.1倍:"+collA.getNumber());  
          
    }  
}
  • 把原来处理对象关系的代码从新封装到一个中介类中,经过这个中介类来处理对象间的关系

中介者模式的优势this

  • 适当地使用中介者模式能够避免同事类之间的过分耦合,使得各同事类之间能够相对独立地使用
  • 使用中介者模式能够将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护
  • 使用中介者模式能够将对象的行为和协做进行抽象,可以比较灵活的处理对象间的相互做用

适用场景code

  • 通常来讲,只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式
  • 能够将网状结构变为星状结构,使同事类之间的关系变的清晰一些
  • 适当的使用中介者模式可使本来凌乱的对象关系清晰,可是若是滥用,则可能会带来反的效果

中介者模式是一种比较经常使用的模式,也是一种比较容易被滥用的模式对象

  • 大多数状况下,将对象间的依赖关系封装的同事类内部就能够的,没有必要非引入中介者模式
  • 滥用中介者模式,只会让事情变的更复杂
相关文章
相关标签/搜索