打破对象交互困局:中介者模式全解析

目录

一、什么是中介者模式

二、中介者模式的工作原理

三、中介者模式的优势

3.1 降低耦合度

3.2 提高可维护性

3.3 简化对象交互

四、中介者模式的局限性

4.1 中介者类复杂度增加

4.2 中介者类与同事类的耦合度问题

五、中介者模式的应用场景

5.1 MVC 框架

5.2 图形用户界面开发

5.3 分布式系统

六、如何选择合适的设计模式

6.1 中介者模式 vs 观察者模式

6.2 中介者模式 vs 代理模式

6.3 选择合适的设计模式

七、总结与展望


一、什么是中介者模式

        中介者模式(Mediator Pattern)是一种行为设计模式,它定义了一个中介对象来封装一系列对象之间的交互,使这些对象不需要显式地相互引用,从而使其耦合松散,并且可以独立地改变它们之间的交互 。在中介者模式中,对象之间的通信不再直接进行,而是通过一个中介者对象来进行。这样做的好处是可以降低对象之间的耦合度,提高系统的可维护性和可扩展性。

        为了更好地理解中介者模式,我们可以通过一个生活中的例子来解释。假设你想要购买一套房子,你可以通过房产中介来寻找合适的房源。房产中介就相当于中介者对象,而你和房东则相当于同事对象。你不需要直接与房东联系,只需要通过房产中介来进行沟通和协调。这样做的好处是可以减少你和房东之间的直接交互,降低耦合度,同时也可以提高效率。

        在代码实现中,中介者模式通常包含以下几个角色:

  • 抽象中介者(Mediator):定义了同事对象之间通信的接口,一般以抽象类或接口的形式存在。
  • 具体中介者(Concrete Mediator):实现了抽象中介者接口,负责协调同事对象之间的交互,维护对各个同事对象的引用 。
  • 抽象同事类(Colleague):定义了同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
  • 具体同事类(Concrete Colleague):是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

下面是一个简单的 Java 代码示例,演示了中介者模式的基本实现:

// 抽象中介者

abstract class Mediator {

public abstract void send(String message, Colleague colleague);

}

// 具体中介者

class ConcreteMediator extends Mediator {

private Colleague colleague1;

private Colleague colleague2;

public void setColleague1(Colleague colleague1) {

this.colleague1 = colleague1;

}

public void setColleague2(Colleague colleague2) {

this.colleague2 = colleague2;

}

@Override

public void send(String message, Colleague colleague) {

if (colleague == colleague1) {

colleague2.receive(message);

} else {

colleague1.receive(message);

}

}

}

// 抽象同事类

abstract class Colleague {

protected Mediator mediator;

public Colleague(Mediator mediator) {

this.mediator = mediator;

}

public abstract void receive(String message);

public abstract void send(String message);

}

// 具体同事类1

class ConcreteColleague1 extends Colleague {

public ConcreteColleague1(Mediator mediator) {

super(mediator);

}

@Override

public void receive(String message) {

System.out.println("同事1收到消息: " + message);

}

@Override

public void send(String message) {

mediator.send(message, this);

}

}

// 具体同事类2

class ConcreteColleague2 extends Colleague {

public ConcreteColleague2(Mediator mediator) {

super(mediator);

}

@Override

public void receive(String message) {

System.out.println("同事2收到消息: " + message);

}

@Override

public void send(String message) {

mediator.send(message, this);

}

}

        在上述代码中,Mediator是抽象中介者,定义了send方法用于同事之间的通信;ConcreteMediator是具体中介者,实现了send方法,并维护了两个同事对象的引用;Colleague是抽象同事类,持有中介者对象的引用,并定义了receive和send方法;ConcreteColleague1和ConcreteColleague2是具体同事类,实现了抽象同事类中的方法,通过中介者来发送和接收消息。

        通过中介者模式,我们可以将对象之间的复杂交互关系封装在中介者对象中,使得对象之间的耦合度降低,提高了系统的可维护性和可扩展性。在实际应用中,中介者模式常用于处理多个对象之间的交互场景,如聊天系统、图形用户界面等。

二、中介者模式的工作原理

        为了更直观地理解中介者模式的工作原理,我们以一个简单的聊天系统为例进行说明 。在这个聊天系统中,有多个用户(具体同事类),他们之间可以互相发送消息。为了实现用户之间的解耦,我们引入了一个聊天服务器(具体中介者)来负责消息的转发。

        假设用户 A、用户 B 和用户 C 在同一个聊天房间中。当用户 A 发送一条消息时,他并不会直接将消息发送给用户 B 和用户 C,而是将消息发送给聊天服务器。聊天服务器接收到消息后,会根据消息的内容和目标用户,将消息转发给用户 B 和用户 C。同样地,当用户 B 或用户 C 发送消息时,也是通过聊天服务器来进行转发的。

具体的工作流程如下:

  1. 用户 A 创建一个消息对象,并调用自己的send方法,将消息发送出去。

  2. 在send方法中,用户 A 将消息传递给聊天服务器(中介者)的sendMessage方法,并传入自己的引用,以便服务器知道消息的发送者。

  3. 聊天服务器接收到消息后&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雨淅淅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值