设计模式之中介者模式

小明开始了解更多的模式

小明买房的事正在顺利的进展着,同时他也知道了代理模式的用处,为了掌握更多的设计模式,他开始自己学习其他模式了,首先它想到的就是中介者模式,因为它似乎觉得中介者模式更能体现他买房的方式。

从名字来看,似乎买房应该用到的是中介者模式,的确,名字容易产生误解,那么中介者模式是怎么定义的呢,它又是解决什么问题的呢?我们先回忆一下外观模式,它帮助极客小明用简单的方法操作了许多影音设备,不然他需要用很繁琐的程序才能看到电影。外观模式解决了一个类和多个类耦合的问题,然而我们的中介者模式是为了解决多个类相互之前的相互依赖。更加准确的说,中介者模式是为了帮助我们解决同事类之间的复杂关系,那么什么是同事类呢?举一个例子,类A和类B存在这样的关系,类A中有一个数字,类B中也有一个数字,类A、类B的数字是10倍的关系,也就是说如果A的数字是10,那么B中的数字就应该是是100,相应的,如果类B数字是200,那么类A中的数字就应该是20

类A:

class A {
    int number;

    public void setNumber(int number, A a) {
        this.number = number;
        coll.setNumber(number*100);
    }

    public void setNumber(int number){
        this.number = number;
    }
}

类B:

class B {
    int number;

    public void setNumber(int number, A a) {
        this.number = number;
        coll.setNumber(number*100);
    }

    public void setNumber(int number){
        this.number = number;
    }
}

使用:

public class Client {
    public static void main(String[] args){

        A a = new A();
        B b = new B();

        a.setNumber(1288, b);
        b.setNumber(87635, a);
    }
}

如果只有像上面两个这样的同事类,我们还能应付过来,但如果像下面这样呢?

同事类

如果对象1发生变化了,有4个对象会被影响,对象5变化了,将有5个对象被影响,所以这种情况下,我们必须解决这种困境,也就是假如对象1发生变化,它不需要关心和去处理它的同事类变化,它只负责自己,不管是变化还是怎样也好,它的职责应该是单一的

我们优化一下上面的A和B,引进一个中介者:

abstract class AbstractMediator{

    protected A a;
    protected B b;

    public AbstractMediator(A a, B b) {
        this.a = a;
        this.b = b;
    }

    public abstract void aAffectB();

    public abstract void bAffectA();
}
class Mediator extends AbstractMediator {

    public Mediator(A a, B b) {
        super(a, b);
    }

    public void aAffectB() {
        int number = a.getNumber();
        b.setNumber(number*100);
    }

    public void bAffectA() {
        int number = b.getNumber();
        a.setNumber(number/100);
    }
}

类A:

class A {
    int number;
    public void setNumber(int number, AbstractMediator am) {
        this.number = number;
        am.aAffectB();
    }
}

类B:

class B {
    int number;
    public void setNumber(int number, AbstractMediator am) {
        this.number = number;
        am.bAffectA();
    }
}

使用

public class Client {
    public static void main(String[] args){

        A a = new A();
        B b = new B();

        AbstractMediator am = new Mediator(a, b);

        a.setNumber(1288, am);
        b.setNumber(87635, am);
    }
}

在代码中,虽然类A和类B有很大的关系,但是都没有在类A和类B中体现出来了,而是通过一个中介者类解耦了。所以有了中介者模式,我们可以将上图中多个同事类的关系改变为这样:

中介者

定义

用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互

角色

角色

  • 同事类(多个)
  • 抽象中介者
  • 实现中介者

中介者模式是一种比较常用的模式,也是一种比较容易被滥用的模式。对于大多数的情况,同事类之间的关系不会复杂到混乱不堪的网状结构,因此,大多数情况下,将对象间的依赖关系封装的同事类内部就可以的,没有必要非引入中介者模式。滥用中介者模式,只会让事情变的更复杂

坚持原创分享,您的支持将鼓励我不断前行!