设计模式笔记:中介者模式

中介者模式:用中介对象来封装对象之间的交互行为。

中介者使对象之间不用显式的引用,降低类对象之间的耦合。

抽象中介者类(Mediator )

1
2
3
4
5
6
7
// 抽象中介者类
class Mediator {
public:
virtual void SetCustomer(Person *person) = 0; // 设置买家
virtual void SetSeller(Person *person) = 0; // 设置卖家
virtual void SendMsg(std::string msg, Person *person) = 0; // 消息传递接口
}

具体中介者(ConMediator )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 具体中介者类
class ConMediator : public Mediator {
public:
void SetCustomer(Person *person)
{
customer_ = person;
}

void SetSeller(Person *person)
{
seller_ = person;
}

void SendMsg(std::string msg, Person *person)
{
//若保存改为数组,则该处可用数组遍历来传递消息
if (person == customer_) {
seller_->GetMsg(msg);
} else {
customer_->GetMsg(msg);
}
}

private:
// 此处指针可用数组来代替,这样能够实现单对多的对象交互
Person *customer_;
Person *seller_;
}

抽象对象(Object )

1
2
3
4
5
6
7
// 抽象对象
class Person {
public:
virtual void SendMsg(std::string msg) = 0;
virtual void GetMsg(std::string msg) = 0;
virtual void SetMediator(Mediator *mediator) = 0;
}

具体对象(ConObject )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// 具体买家
class ConCustomer: public Person {
public:
void SetMediator(Mediator *mediator)
{
mediator_ = mediator;
}

void SendMsg(std::string msg)
{
mediator_->SendMsg(msg, this);
}

void GetMsg(std::string msg)
{
std::cout << "Customer get mssage from Mediator: "<< msg << std::endl;
}

private:
Meadiator *mediator_;
}

// 具体卖家
class ConSeller: public Person {
public:
void SetMediator(Mediator *mediator)
{
mediator_ = mediator;
}

void SendMsg(std::string msg)
{
mediator_->SendMsg(msg, this);
}

void GetMsg(std::string msg)
{
std::cout << "Seller get mssage from Mediator: "<< msg << std::endl;
}

private:
Meadiator *mediator_;
}

客户端调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main() {
Mediator *mediator = new ConMediator();
Person *customer = new ConCustomer();
Person *seller = new ConSeller();

seller->SetMediator(mediator);
customer->SetMediator(mediator);

seller->SendMsg("I want to sell my SU7");
customer->SendMsg("I want to buy SU7");
delete mediator;
delete customer;
delete seller;
return 0;
}