首页 > 其他分享 >中介者模式

中介者模式

时间:2022-09-18 17:46:24浏览次数:77  
标签:Colleague mediator ConcreteColleague1 Mediator 同事 模式 中介

抽象中介者(Mediator):抽象中介者角色定义统一的接口,用于各同事角色之间的通信。

抽象同事类(Colleague ):每一个同事角色都知道中介者角色,而且与其它的同事角色通信的时候,一定要通过中介者角色协作。每个同事类的行为分两种:一种是同事本身行为,比如改变对象本身的状态,处理自己的行为等,这种行为叫做自发行为,与其它同事类或者中介者没有任何依赖;第二种是必须依赖中介者才能完成的行为,叫做依赖方法。

具体中介者类(Concrete Mediator):具体中介者角色通过协调各同事角色实现协作行为,因此它必须依赖于各个同事角色。

具体同事类(Concrete Colleague):这里以ConcreteColleague1为例,ConcreteColleague2不再赘述。

代码:

#include <iostream>

using namespace std;

class Colleague;

//定义一个中介者接口,包含对象改变所需调用函数。
class Mediator
{
public:
    virtual ~Mediator()
    {
    }
    virtual void changed(Colleague *) = 0;
};

//定义"同事"类接口,初始化需要一个中介者对象,并通过该类更新另外一个"同事"
class Colleague
{
public:
    //初始化中介者类对象
    Colleague(Mediator * mediator)
    {
        this->mediator = mediator;
    }
    //更新另外一个类
    virtual void changed()
    {
        mediator->changed(this);
    }
private:
    Mediator *mediator;
};

//具体的同事类1
class ConcreteColleague1 :public Colleague
{
public:
    ConcreteColleague1(Mediator * mediator) :Colleague(mediator)
    {
    }
    void update()
    {
        cout << "update ConcreteColleague1 from ConcreteColleague2" << endl;
    }
};
//具体的同事类2
class ConcreteColleague2 :public Colleague
{
public:
    ConcreteColleague2(Mediator * mediator) :Colleague(mediator)
    {
    }
    void update()
    {
        cout << "update ConcreteColleague2 from ConcreteColleague1" << endl;
    }
};

//具体的中介者类,实现更新函数changed。
class ConcreteMediator :public Mediator
{
private:
    ConcreteColleague1 * colleague1;
    ConcreteColleague2 * colleague2;
public:
    void setColleague1(ConcreteColleague1 * colleague)
    {
        colleague1 = colleague;
    }
    void setColleague2(ConcreteColleague2 * colleague)
    {
        colleague2 = colleague;
    }
    ConcreteMediator()
    {
        //colleague1 = new ConcreteColleague1(this);
    }
    ~ConcreteMediator()
    {
    }

    virtual void changed(Colleague* colleague)
    {
        if (colleague == colleague1)
        {
            colleague2->update();
        }
        else if (colleague == colleague2)
        {
            colleague1->update();
        }
        else;
    }
};


int main()
{
    ConcreteMediator concreteMediator;
    ConcreteColleague1  colleague1(&concreteMediator);
    ConcreteColleague2  colleague2(&concreteMediator);
    concreteMediator.setColleague1(&colleague1);
    concreteMediator.setColleague2(&colleague2);
    //"同事1"通过中介者更新"同事2"
    colleague1.changed();
    //"同事2"通过中介者更新"同事1"
    colleague2.changed();

    getchar();
    return 0;
}

输出:

pdate ConcreteColleague2 from ConcreteColleague1
update ConcreteColleague1 from ConcreteColleague2




参考:

https://www.guyuehome.com/38376

标签:Colleague,mediator,ConcreteColleague1,Mediator,同事,模式,中介
From: https://www.cnblogs.com/huvjie/p/16705301.html

相关文章

  • 状态模式
    上下文(Context):也称为上下文,它定义了客户端需要的接口,内部维护一个当前状态,并负责具体状态的切换。抽象状态(State):定义一个接口,用以封装环境对象中的特定状态所对应的......
  • 重学Java设计模式 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1zFJn7Ls5yEPOBijRMd82cQ点击这里获取提取码 ......
  • 设计模式 -- Strategy(策略模式)
    Strategy(策略模式)定义一系列算法,把他们一个个封装起来,并且是他们可以互相替换(变化)。该模式似的算法可以独立于使用它的客户程序(稳定的)而变化(扩展,子类)动机(Motivation)在软......
  • 组合模式
    理论 组合模式(Composite),将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。  透明方式与安全方式透明......
  • 商业模式定义
    商业模式是指企业为了实现其客户价值的最大化,把能使企业运行的内部资源和外部相关要素进行有效的整合,形成一个完整,高效率的,具有独特核心竞争力的企业运行系统,并通过最有的......
  • 单例模式
    单例模式就是只有一个对象饿汉式1、将构造器私有化2、在类中直接创建一个私有对象(static)3、向外暴露一个静态公共方法,返回对象  懒汉式1.将构造器私有化2、......
  • JAVA设计模式-工厂模式
    JAVA设计模式-工厂模式简单工厂模式介绍简单工厂模式就是定义一个工厂类,工厂类提供获取实例的方法,方法会根据传入的参数不同来返回不同的实例。不同的实例基本都有共同......
  • 适配器模式
    Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。该角色把其他类转换为我们期望的接口Adapter(适配器类):将被适配者和目标接口组合......
  • MVC,大家都知道的模式……不太好
    MVC,大家都知道的模式……不太好“MVC是引用最多(也是最错误引用)的模式之一”——MartinFowlerCréditphoto:史蒂夫·约翰逊与许多关于这个主题的文章和评论相反,......
  • Jmeter远程服务模式运行时引用csv文件的路径配置
    问题在使用jmeter过程中,本机的内存等配置不足,启动较多的线程时,可以采用分布式运行。在分布式运行的时候,jmeter会自动将脚本从master主机发送到remote主机上,所以不需要考......