中介者模式

本文介绍了UML中的组合关系,描述了整体与部分的同生共死关系,并通过C++代码示例展示了中介者模式如何解耦对象交互,让同事对象通过中介者发送和接收消息。
摘要由CSDN通过智能技术生成

组合关系:

组合(Composition)关系也表示的是一种整体和部分的关系,但是在组合关系中整体对象可以控制成员对 象的生命周期,一旦整体对象不存在,成员对象也不存在,整体对象和成员对象之间具有同生共死的关系。 在UML中组合关系用带实心菱形的直线表示。即captain是controltower的一个成员,他是controltower的list列表的一个成员。

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

在下面的中介者模式例子中,具体同事对象,通过调用中介者对象中的函数来达到目的,而不是对象自己调用函数

//
// Created by 666 on 2023/11/19.
//
#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) {}  // 内联函数 将传入的 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); }
    //传入 this 指针通过中介者来执行操作,而不是自己执行
    void send(Colleague *colleague) override //  判断执行 send 函数的是 colleague 容器中的哪一个对象
    {
        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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值