0
点赞
收藏
分享

微信扫一扫

【ControlNet v3版本论文阅读】

科牛 04-07 13:00 阅读 2

中介者模式 (Mediator Pattern) 是一种在软件设计中用来降低多个对象或组件间的耦合度的设计模式,它属于行为型设计模式。在 Java 中,中介者模式的核心思想是定义一个中介对象,让原本相互依赖的对象之间通过中介者进行通信,而不是直接相互引用。这样可以使各个对象之间的关系更加清晰,更容易维护和扩展。

在现实生活中,中介者模式的例子随处可见,下面是一些直观易懂的生活场景:

  • 房屋租赁中介: 在房屋租赁市场中,房东和租客通常不直接交流,而是通过房地产中介来进行房源信息发布、看房、签约等一系列活动。这里的房地产中介就扮演了中介者的角色,它负责协调房东和租客的需求和沟通,减少了双方直接交流的复杂性和风险。
  • 商业谈判中间人: 在商业交易或合同谈判中,买卖双方有时会聘请律师或专业顾问作为中间人。中间人在谈判过程中传达双方意见,帮助解决分歧,促进协议达成,降低了双方因直接协商可能产生的矛盾冲突。
  • 教育咨询机构: 当学生和学校之间需要建立联系时,教育咨询机构往往会作为一个中介,收集学生需求,推荐适合的学校和课程,协助完成申请流程等。这样的中介角色能够有效连接供需双方,提高信息匹配效率。

以上都是现实生活中的中介者模式应用场景,它们的核心都是引入了一个独立的角色,来管理和协调多方面的交互关系,从而使得各参与方可以专注于自身的核心功能,同时保持系统运行的有序和高效。

代码示例

这里我们将创建了一个中介者对象mediator,以及两个同事对象colleagueA和colleagueB。我们将这两个同事对象添加到中介者的同事列表中,然后分别调用它们的send方法发送消息。由于中介者的存在,这些消息会被转发给其他同事,从而实现了对象之间的通信解耦。

抽象同事类Colleague:

public abstract class Colleague {
    protected Mediator mediator;

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

    public abstract void send(String message);
    public abstract void receive(String message);
}

两个具体同事类ConcreteColleagueA和ConcreteColleagueB,继承自Colleague:

public class ConcreteColleagueA extends Colleague {
    public ConcreteColleagueA(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void send(String message) {
        System.out.println("ConcreteColleagueA sends message: " + message);
        mediator.send(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println("ConcreteColleagueA receives message: " + message);
    }
}

public class ConcreteColleagueB extends Colleague {
    public ConcreteColleagueB(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void send(String message) {
        System.out.println("ConcreteColleagueB sends message: " + message);
        mediator.send(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println("ConcreteColleagueB receives message: " + message);
    }
}

具体中介者类ConcreteMediator,在send方法中调用对象的接收方法以通知其他同事:

public interface Mediator {
    void send(String message, Colleague colleague);
}


public class ConcreteMediator implements Mediator {
    private List<Colleague> colleagues;

    public ConcreteMediator() {
        colleagues = new ArrayList<>();
    }

    public void addColleague(Colleague colleague) {
        colleagues.add(colleague);
    }

    @Override
    public void send(String message, Colleague originator) {
        for (Colleague colleague : colleagues) {
            if (colleague != originator) {
                colleague.receive(message);
            }
        }
    }
}

运行函数:

public class Main {
    public static void main(String[] args) {
        Mediator mediator = new ConcreteMediator();

        Colleague colleagueA = new ConcreteColleagueA(mediator);
        Colleague colleagueB = new ConcreteColleagueB(mediator);

        mediator.addColleague(colleagueA);
        mediator.addColleague(colleagueB);

        colleagueA.send("Hello from A");
        colleagueB.send("Hello from B");
    }
}

中介者模式适合应用场景

  1. 当一些对象和其他对象紧密耦合以致难以对其进行修改时, 可使用中介者模式。该模式让你将对象间的所有关系抽取成为一个单独的类, 以使对于特定组件的修改工作独立于其他组件。

  2. 当组件因过于依赖其他组件而无法在不同应用中复用时, 可使用中介者模式。应用中介者模式后, 每个组件不再知晓其他组件的情况。 尽管这些组件无法直接交流, 但它们仍可通过中介者对象进行间接交流。 如果你希望在不同应用中复用一个组件, 则需要为其提供一个新的中介者类。

  3. 如果为了能在不同情景下复用一些基本行为, 导致你需要被迫创建大量组件子类时, 可使用中介者模式。由于所有组件间关系都被包含在中介者中, 因此你无需修改组件就能方便地新建中介者类以定义新的组件合作方式。

中介者模式优点

  1. 降低复杂度:通过引入中介者,一对多交互转化为一对一交互,减少了对象间的直接交互次数,从而使程序的复杂程度显著下降。
  2. 解耦:中介者模式通过集中控制交互逻辑,使各对象之间不必彼此了解,降低了类之间的耦合性。这提高了代码的可维护性和可扩展性,因为一个对象的改变不太可能影响到其他对象。
  3. 简化通信:系统中的复杂性被分解到中介者中,使得各个模块职责更加分明,易于管理和维护。

中介者模式缺点

  1. 增加系统的复杂性:需要在系统中额外引入中介者对象,这可能会增加系统结构的复杂性。
  2. 中介者可能变得复杂难维护:当同事类数量增多时,中介者的职责可能随之膨胀,从而变得复杂且难以维护。
举报

相关推荐

0 条评论