组合关系:
组合(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;
}