首页 > 其他分享 >小谈设计模式(26)—中介者模式

小谈设计模式(26)—中介者模式

时间:2023-12-20 14:31:44浏览次数:33  
标签:26 小谈 对象 mediator 同事 中介 message 设计模式 public

(小谈设计模式(26)—中介者模式)

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。 在这里插入图片描述

中介者模式

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过将对象之间的通信封装到一个中介者对象中,从而实现对象之间的松耦合。中介者模式可以减少对象之间的直接依赖,提高系统的灵活性和可维护性。

分析

在中介者模式中,存在一个中介者对象,它封装了对象之间的通信逻辑。对象之间的通信不再直接发生,而是通过中介者对象进行。当一个对象需要与其他对象进行通信时,它不需要知道其他对象的具体细节,只需要与中介者进行交互即可。 在这里插入图片描述

角色分析

抽象中介者(Mediator)

定义了中介者对象的接口,它通常包含一个或多个抽象的通信方法,用于定义对象之间的通信规则。

具体中介者(ConcreteMediator)

实现了抽象中介者的接口,它通过协调各个同事对象来实现协作行为。

抽象同事类(Colleague)

定义了同事对象的接口,它通常包含一个中介者对象的引用,用于与中介者进行通信。

具体同事类(ConcreteColleague)

实现了抽象同事类的接口,它与其他同事对象通过中介者进行通信。 在这里插入图片描述

工作过程

各个同事对象将自己的引用传递给中介者对象,以便中介者对象能够与各个同事对象进行通信。 当一个同事对象需要与其他同事对象进行通信时,它将请求发送给中介者对象。 中介者对象接收到请求后,根据通信规则进行相应的处理,并将请求转发给目标同事对象。 目标同事对象接收到请求后,进行相应的处理。 在这里插入图片描述

优缺点分析

优点分析

1

减少了对象之间的直接依赖,提高了系统的灵活性和可维护性。

2

将对象之间的通信集中到一个中介者对象中,使得系统结构更加清晰。

缺点分析

1

中介者对象将承担较多的责任,可能会变得复杂。

2

如果中介者对象存在过多的逻辑,可能会影响系统的性能。 在这里插入图片描述

适用场景

1

当对象之间存在复杂的通信逻辑时,可以使用中介者模式将通信逻辑集中到一个中介者对象中。

2

当对象之间的通信关系呈现网状结构时,可以使用中介者模式将通信关系简化为星型结构。 在这里插入图片描述

Java程序分析

// 抽象中介者
interface Mediator {
    void sendMessage(String message, Colleague colleague);
}

// 具体中介者
class ConcreteMediator implements 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 sendMessage(String message, Colleague colleague) {
        if (colleague == colleague1) {
            colleague2.receiveMessage(message);
        } else if (colleague == colleague2) {
            colleague1.receiveMessage(message);
        }
    }
}

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

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

    public abstract void sendMessage(String message);
    public abstract void receiveMessage(String message);
}

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

    @Override
    public void sendMessage(String message) {
        mediator.sendMessage(message, this);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println("ConcreteColleague1 received message: " + message);
    }
}

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

    @Override
    public void sendMessage(String message) {
        mediator.sendMessage(message, this);
    }

    @Override
    public void receiveMessage(String message) {
        System.out.println("ConcreteColleague2 received message: " + message);
    }
}

// 测试类
public class MediatorPatternExample {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();

        ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
        ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);

        mediator.setColleague1(colleague1);
        mediator.setColleague2(colleague2);

        colleague1.sendMessage("Hello from colleague1");
        colleague2.sendMessage("Hi from colleague2");
    }
}

分析

1

在上述示例中,Mediator是抽象中介者接口,定义了中介者对象的通信方法。ConcreteMediator是具体中介者类,实现了抽象中介者接口,并通过协调各个同事对象来实现协作行为。

2

Colleague是抽象同事类,定义了同事对象的接口,并包含一个中介者对象的引用,用于与中介者进行通信。ConcreteColleague1和ConcreteColleague2是具体同事类,分别实现了抽象同事类的接口。

3

在测试类MediatorPatternExample中,创建了具体中介者对象和具体同事对象,并将同事对象的引用传递给中介者对象。然后,通过同事对象调用sendMessage方法发送消息,中介者对象根据通信规则进行处理,并将消息转发给目标同事对象。最后,目标同事对象接收到消息并进行处理。

输出结果

ConcreteColleague2 received message: Hello from colleague1
ConcreteColleague1 received message: Hi from colleague2
以上示例演示了中介者模式的基本实现,通过中介者对象实现了对象之间的松耦合,实现了对象之间的通信。

总结

总结起来,中介者模式通过将对象之间的通信封装到一个中介者对象中,实现了对象之间的松耦合。它可以减少对象之间的直接依赖,提高系统的灵活性和可维护性。中介者模式适用于对象之间存在复杂的通信逻辑或通信关系呈现网状结构的场景。

标签:26,小谈,对象,mediator,同事,中介,message,设计模式,public
From: https://blog.51cto.com/u_16193391/8907464

相关文章

  • 设计模式—代理模式
    介绍代码接口创建接口ImagepublicinterfaceImage{voiddisplay();}实体类创建实体类RealImagepublicclassRealImageimplementsImage{privateStringfileName;publicRealImage(StringfileName){this.fileName=fileName;......
  • 设计模式—观察者模式
    介绍代码观察者父类只有一个属性subject表示订阅的主题。update方法用于更新观察者本身publicabstractclassObserver{protectedSubjectsubject;publicabstractvoidupdate();}主题类主题类Subject直到自己的订阅者们,每当主题状态改变的时候就......
  • Python实现软件设计模式6:单例模式 Singleton Pattern
    动机针对某个类,为了保证系统中只创建一个示例,并且易于被访问(例如操作系统的任务管理器,软件的登陆注册界面)自行创建这个实例,无法从外部创建这个实例,向系统提供这个实例饿汉式单例Java版本在类加载的时候,就创建对象,如果后续得不到使用,可能会造成内存资源浪费懒汉式单......
  • Python实现软件设计模式5:原型模式 Prototype Pattern
    动机对象的克隆问题,想要复制出本对象的一个副本,属性方法一模一样从需求上来说,先快速克隆对象,后续根据需求再进行对象局部属性的修改区分为深克隆和浅克隆两个版本,默认为浅克隆角色Prototype抽象原型类ConcretePrototype具体原型类Client客户类浅克隆与深克隆......
  • 设计模式—模板模式
    介绍代码游戏模板类定义一个游戏模板虚类Game,抽象并规范好游戏的进行流程publicabstractclassGame{abstractvoidinit();abstractvoidstartPlay();abstractvoidendPlay();//模板publicfinalvoidplay(){//初始化......
  • 设计模式—策略模式
    介绍在策略模式(StrategyPattern)中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代......
  • 设计模式的关系
    泛化关系泛化关系用一条带空心箭头的直接表示,可以理解为继承eg:汽车是基类,而suv这辆车就是他的子类实现关系实现关系用一条带空心箭头的虚线表示;eg:将车作为一个接口类(模糊概念,比如跑的挺快),下边的小汽车或是自行车都是车这个模糊概念的实现 聚合关系聚合关系用一条带空......
  • 创建型设计模式-原型模式
    原型设计模式是一种对象创建型模式,它通过复制现有对象来创建新的对象,而无需显式地调用构造函数。简单来说,原型设计模式就是通过克隆已有对象来创建新对象。举一个通俗易懂的例子,假设我们有一个图形库,其中有一个基类Shape表示图形,它有一个纯虚函数draw()用于绘制图形。现在我们......
  • 格式工厂MP4视频转格式(H265->H264)图文详解
    最近上传到网站上的视频播放时只有声音没有图像,但是在本地播放一切正常,检查后发现问题是有些浏览器不支持播放H265格式的视频。不能让访问网站的用户去换浏览器或者单独安装浏览器插件,最简单的解决办法还是自己转化视频格式重新上传。推荐一个老牌免费使用简单的视频格式转换软件—......
  • H5网页流媒体播放器EasyPlayer播放H.265录像时,无法倍速回放是什么原因?
    流媒体播放器EasyPlayer是我们流媒体组件系列中关注度较高的产品,经过多年的发展和迭代,目前已经有多个应用版本,包括RTSP版、RTMP版、Pro版,以及js版,其中js版本作为网页播放器,受到了用户的广泛使用。在功能上,EasyPlayer支持直播、点播、录像、快照截图、MP4播放、多屏播放、倍数播放......