中介者模式--设计模式

简介: 中介者模式--设计模式

中介者模式


一、动机


1.在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。


2.在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。


二、介绍


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


主要解决: 对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。


何时使用: 多个类相互耦合,形成了网状结构。


如何解决: 将上述网状结构分离为星型结构。


关键代码: 对象 Colleague 之间的通信封装到一个类中单独处理。


应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。


优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。


**缺点:**中介者会庞大,变得复杂难以维护。


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


注意事项: 不应当在职责混乱的时候使用。


三、结构


四、要点总结


1.将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象相互关联”为“多个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。


2.随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。这时候可以对Mediator对象进行分解处理。


3.Facade模式是解耦系统间(单向)的对象关联关系;Mediator模式是解耦系统内各个对象之间(双向)的关联关系。


五、代码展示

#include <iostream>
#include <vector>

using namespace std;

#define DELETE(pointer) delete pointer; pointer=nullptr

class Colleague;

class IMediator //抽象产品
{
protected:
  vector<Colleague *> colleagues; // 维护和封装一系列同事对象

public:
  IMediator() : colleagues(0) {}
  virtual ~IMediator() {}

  virtual void add(Colleague *colleague) = 0; // 增加同事类
  virtual void send(Colleague *colleague) = 0; // 转发同事类消息
  
};

class Colleague
{
protected:
  IMediator *mediator; // 中介者接口

public:
  Colleague(IMediator *mediator) :mediator(mediator) {} 
  virtual void notify() = 0; // 要发消息的内容
  virtual void send() = 0; // 消息发布到中介者动作
  
};

class ConcreteColleague1 : public Colleague //具体同事1
{
public:
  ConcreteColleague1(IMediator *mediator) : Colleague(mediator) {}
  virtual void notify() { cout << "我是租客,要租房!" << endl; }
  virtual void send() { mediator->send(this); }
};

class ConcreteColleague2 : public Colleague //具体同事2
{
public:
  ConcreteColleague2(IMediator *mediator) : Colleague(mediator) {}
  virtual void notify() { cout << "我是房东,要出租房!" << endl; }
  virtual void send() { mediator->send(this); }
};

class ConcreteMediator : public IMediator //具体中介者,要放在具体类同事1和具体同事2的后面,否则调用notify函数会报错没定义
{
public:
  void add(Colleague *colleague) override { colleagues.push_back(colleague); }
  void send(Colleague *colleague) override {
    for (auto *iter : colleagues)
      if (iter == colleague)
      {
        iter->notify();
        break;
      }
  }
};

void doMediatorPattern()
{
  // 初始化中介者对象、同事1对象、同事2对象
  IMediator *mediator = new ConcreteMediator();
  Colleague *colleague1 = new ConcreteColleague1(mediator);
  Colleague *colleague2 = new ConcreteColleague2(mediator);
  mediator->add(colleague1); // 中介者把同事加入同事集合
  mediator->add(colleague2);

  colleague1->send(); // 租客在中介者发布租房信息
  colleague2->send(); // 房东也在中介者发布出租房信息

  DELETE(colleague2);
  DELETE(colleague1);
  DELETE(mediator);
}

int main()
{
  doMediatorPattern();

  system("pause");
  return 1;
}

目录
相关文章
|
设计模式 前端开发
设计模式21 - 中介者模式【【Mediator Pattern】
设计模式21 - 中介者模式【【Mediator Pattern】
52 0
|
设计模式 调度
行为型设计模式09-中介者模式
行为型设计模式09-中介者模式
42 0
|
2月前
|
设计模式 Java
Java设计模式-中介者模式(20)
Java设计模式-中介者模式(20)
|
3月前
|
设计模式 前端开发 Java
【十三】设计模式~~~行为型模式~~~中介者模式(Java)
文章详细介绍了中介者模式(Mediator Pattern),这是一种对象行为型模式,用于封装一系列对象的交互,降低系统耦合度,并简化对象之间的交互关系。通过案例分析、结构图、时序图和代码示例,文章展示了中介者模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。
【十三】设计模式~~~行为型模式~~~中介者模式(Java)
|
4月前
|
设计模式 JavaScript
js设计模式【详解】—— 中介者模式
js设计模式【详解】—— 中介者模式
66 5
|
5月前
|
设计模式
中介者模式-大话设计模式
中介者模式-大话设计模式
|
5月前
|
设计模式 Java 程序员
Java设计模式之中介者模式详解
Java设计模式之中介者模式详解
|
5月前
|
设计模式
设计模式之中介者模式
设计模式之中介者模式
|
5月前
|
设计模式 前端开发 NoSQL
设计模式第八讲:观察者模式和中介者模式详解
 定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。
212 0
|
6月前
|
设计模式 Go
[设计模式 Go实现] 行为型~中介者模式
[设计模式 Go实现] 行为型~中介者模式

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    43
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    48
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    58
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    63
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    58
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    42
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    110
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78
  • 下一篇
    无影云桌面