中介者模式(Mediator)

  1. 定义
    用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

  2. 类图


    中介者模式(Mediator)_第1张图片
    Mediator
  3. 例子

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());
        
    }
}

例子来源于这里
中介的目的更在于调和

补充

  • 解耦是个老生常谈的话题,也是设计模式的目的之一,中介者是最为常见的解耦方式,用一个类就能解决很大的问题,但是中介也有职责,不要让他担任太多,否则就得不偿失了。

你可能感兴趣的:(中介者模式(Mediator))