[设计模式] 浅谈中介者模式

2024 年 6 月 5 日 星期三
/ ,
89

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

[设计模式] 浅谈中介者模式

中介者模式

模式功能说明:中介者模式使得对象之间的交互方式不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。

模式思路与原理

中介者模式的主要角色有:

  • 抽象中介者(Mediator):定义了同事对象到中介者对象的接口。
  • 具体中介者(ConcreteMediator):实现了抽象中介者的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。
  • 抽象同事类(Colleague):定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象。
  • 具体同事类:每个具体同事类都只知道自己的行为,而不了解其他同事类的情况,但它们都认识中介者对象。

案例

//抽象中介者
abstract class Mediator {
    public abstract void contact(String content, Colleague coll);
}

//具体中介者
class ConcreteMediator extends Mediator {
    private ColleagueA collA;
    private ColleagueB collB;

    public void setCollA(ColleagueA collA) {
        this.collA = collA;
    }

    public void setCollB(ColleagueB collB) {
        this.collB = collB;
    }

    public void contact(String content, Colleague coll) {
        if (coll == collA) {
            collB.getMessage(content);
        } else {
            collA.getMessage(content);
        }
    }
}

//抽象同事类
abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }
}

//具体同事类A
class ColleagueA extends Colleague {
    public ColleagueA(Mediator mediator) {
        super(mediator);
    }

    public void contact(String content) {
        mediator.contact(content, this);
    }

    public void getMessage(String message) {
        System.out.println("同事A得到消息:" + message);
    }
}

//具体同事类B
class ColleagueB extends Colleague {
    public ColleagueB(Mediator mediator) {
        super(mediator);
    }

    public void contact(String content) {
        mediator.contact(content, this);
    }

    public void getMessage(String message) {
        System.out.println("同事B得到消息:" + message);
    }
}

ConcreteMediator是具体的中介者,它知道所有的具体同事类(ColleagueA和ColleagueB),并实现了抽象中介者的方法。当一个同事类需要与另一个同事类通信时,它不直接与另一个同事类通信,而是通过中介者(ConcreteMediator)来完成。

使用场景:

  • 系统中对象之间存在比较复杂的引用关系,导致他们之间的依赖关系结构混乱而且难以复用该对象。
  • 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

优缺点

优点:

  1. 降低了类的复杂度,将一对多转化成了一对一。
  2. 各个类之间的解耦。
  3. 符合迪米特原则,即最少知道原则。

缺点:

  1. 中介者会膨胀得很大,逻辑复杂。
  2. 如果对象之间的交互复杂,中介者会变得复杂难以维护。

总结

中介者模式遵循了设计模式的封装变化、开闭原则、迪米特法则和依赖倒置原则。 中介者模式它通过一个中介者对象来封装一系列的对象交互。中介者使得各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。但是,如果设计不当,中介者对象本身很容易变得过于复杂。

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...