23种设计模式C++源码与UML实现--中介者模式

标签: 设计模式

中介者模式

Mediator模式也叫做中介者模式,是行为模式之一,在Mediator模式中,类之间的交互行为被统一放在Mediator的对象中,对象通过Mediator对象同其他对象交互,Mediator对象起着控制器的作用。

在这里插入图片描述

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

Mediator抽象中介者

中介者类的抽象父类

ConcreteMediator

具体的中介者类

Colleague

关联类的抽象父类

concreteColluague

具体的关联类

适用于:用一个中介对象,封装一些列对象的交换,中介者是各个对象不需要显示的相互作用,从而实现耦合松散,而且可以独立的改变它们之间的交换。

模式优点

  1. 将系统按功能分割成更小的对象,符合类的最小设计原则
  2. 对关联对象的集中控制
  3. 娇小类的耦合程度,明确类之间的相互关系:当类之间的关系过于复杂时,其中任何一个类的修改都会影响到其他类,不符合类的设计的开闭原则,而mediator模式将原来相互依存的多对多的类之间的关系简化为Mediator控制类与其他关联类的一对多的关系,当其中一个类修改时,可以对其他关联类不产生影响(即使有修改,也集中在Mediator控制类)
  4. 有利于提高类的重用性
//
// Created by andrew on 2020/11/28.
//
#include <iostream>

using namespace std;

class Mediator;

class Person {
public:
    Person(string name, int sex, int condi, Mediator *m) {
        m_name = name;
        m_sex = sex;
        m_condi = condi;
        mediator = m;
    }
    virtual ~Person() = default;

    string getName() {
        return m_name;
    }

    int getSex() const {
        return m_sex;
    }

    int getCondi() const {
        return m_condi;
    }

    virtual void getParter(Person *p) = 0;

protected:
    string m_name;
    int m_sex;
    int m_condi;
    Mediator *mediator;
};

class Mediator {
public:
    virtual ~Mediator() = default;
    void setMan(Person *man) {
        pMan = man;
    }

    void setWoman(Person *woman) {
        pWoman = woman;
    }

    virtual void getParter() {
        if (pWoman->getSex() == pMan->getSex()) {
            cout << "性别相同不能找对象" << endl;
        }
        if (pWoman->getCondi() == pMan->getCondi()) {
            cout << pWoman->getName() << "     and    " << pMan->getName() << "    OK" << endl;
        } else {
            cout << pWoman->getName() << "    and    " << pMan->getName() << "     failed" << endl;
        }
    }


private:
    Person *pMan;
    Person *pWoman;
};

class Woman : public Person {
public:
    Woman(string name, int sex, int condi, Mediator *m) : Person(name, sex, condi, m) {

    }

    virtual void getParter(Person *p) {
        mediator->setMan(p);
        mediator->setWoman(this);
        mediator->getParter(); // 找对象
    }
};

class Man : public Person {
public:
    Man(string name, int sex, int condi, Mediator *m) : Person(name, sex, condi, m) {

    }

    virtual void getParter(Person *p) {
        mediator->setMan(this);
        mediator->setWoman(p);
        mediator->getParter();
    }
};

int main(int argc, char *argv[]) {
    auto *m = new Mediator;
    Person *alice = new Woman("alice", 2, 4, m);

    Person *bob = new Man("bob", 1, 4, m);

    alice->getParter(bob);
    bob->getParter(alice);
    delete bob;
    delete alice;
    delete m;
    cout << "mediator demo" << endl;
    return 0;
}
版权声明:本文为andrewgithub原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/andrewgithub/article/details/110355869

智能推荐

23种设计模式C++源码与UML实现--备忘录模式

备忘录模式 Memento模式也叫备忘录模式,是行为模式之一,它的作用是保存对象内部状态,并在需要的时候(undo/roback)回复对象以前的状态。 应用场景 如果一个对象需要保存状态,并通过undo或者roback等操作回复到通知以前的状态时,可以使用Memmento模式。 一个类需要保存它的对象的状态(相当于Originator角色) 设计一个类,该类只是用来保存上述对象的状态(相当于Mem...

23种设计模式C++源码与UML实现--责任链模式

责任链模式 Chain of Responsibility CoR模式,也叫责任链模式或者责任连锁模式,是行为模式之一,该模式构造一系列分别担当不同的职责的类的对象来共同完成一个任务,这些类的对象之间像一条链条一样紧密相连,所以被称为责任链模式。 例1:比如客户Client客户想完成一个任务,这个任务包括a,b,c,d四个部分。a完成了之后交个b,b完成了之后交给c,c完成了之后交给d。 角色和职...

23种设计模式C++源码与UML实现--命令模式

命令模式 Command模式也叫命令模式,是行为设计模式的一种。Command模式通过被称为Command的类封装了对目标对象的调用行为以及调用参数。 在面向对象的程序设计中,一个对象调用另外一个对象,一边情况下调用的过程是,创建目标对象实例;设置调用参数,调用目标对象的方法。 但是有些情况下有必要使用一个专门的类对这种调用过程加以封装,我们把这种专门的类称作Command类。 整个调用过程比较繁...

23种设计模式C++源码与UML实现--模板模式

模板模式 Template Method模式也叫模板方法模式,是行为模式之一,它具有把特定的步骤算法中的某些必要的处理委让给抽象方法,通过子类继承抽象方法的不同实现改变整个算法的行为。 使用场景 具有统一的操作步骤或者操作过程 具有不同的操作细节 存在多个具有同样操作步骤的应用场景,某些具体的操作细节却各不相同 在抽象类中统一操作步骤,并规定好接口,让子类实现接口,这样可以把各个具体的子类实现操作...

23种设计模式C++源码与UML实现--享元模式

享元模式 Flyweight模式也叫做享元模式,是构造型模式之一,他通过与其他类似对象共享数据来减少内存占用。 抽象享元模式: 所有具有享元类的父亲,规定一些需要实现的公共接口。 具体享元角色: 抽象享元角色的具体实现类,并实现了抽象享元角色规定的方法 享元工厂角色: 负责创建和管理享元角色 使用场景: 以共享的方式,高效支持大量的细粒度的对象...

猜你喜欢

23种设计模式C++源码与UML实现--解释模型

解释模型 一些应用提供了内建的脚本或者宏语言来让用户可以定义它们能够在系统中进行的操作。Interpreter模式的目的就是使用一个解释器为用户提供一个一门定义语言的语法表示的解释器,然后通过这个解释器来解释语言中的句子。 Interpreter模式提供了这样一个实现解释器的框架。 Interpreter模式中,提供了TerminalExpression和NonterminalExpression...

23种设计模式——(8)中介者模式

定义 用一个中介对象封一系列的对象交互,中介者使各对象不需要明显地相互作用,从而使其解耦松散,而且可以独立地改变它们之间的交互 中介者模式通用类图 中介者模式的优点 中介者模式的缺点...

23种设计模式之中介者模式

中介者模式本质 解耦多个部门对象之间的交互关系。每个对象都持有中介者对象的引用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系 android最常见的场景 MVC模式(其中的C),控制器就是一个中介者对象。M和V都和它打交道 总经理接口:总经理有两件事情:注册每个部门,向部门发送命令 部门接口:每个部门也只干两件事情,做自己本职工作和向总经理发送请求 科研部门 市场部部门 财务部部门...

Java23种设计模式——中介者模式

该系列文章为博主学习笔记,原文请参考参考链接 本文禁止转载,但是欢迎大家留言区留言交流[微笑] 中介者模式特(面)点(试):又称调停者模式。如果系统中对象之间的联系呈现为网状结构,对象之间存在大量的多对多联系(一个对象里面引用了其他对象,而其他对象又被另外一些对象引用),可以采用中介者模式,将一个网状结构转换成为一个星形结构。通过引入中介者对象(维持了对各个组件对象的引用),使一个对象不在与另一个...

VUE给动态生成的el-checkbox添加v-model

需求描述:根据返回的数据,页面动态for循环添加el-checkbox,动态绑定v-model; html代码: tabList数据格式: 之前的错误做法: 开始以为这样就可以了,毕竟在el-checkbox上用item.status绑定v-model,后面发现checkbox点击的时候并没有更新; 解决方案: 官方文档...