设计模式 -- 代理模式 -- c++实现

注:本文主要代码基于大话设计模式里的C#代码(第7章)。

 

UML图:

 

代理模式的实现:

代理模式很好实现,注意的是要将RealSubject要代理的功能抽象出一个Subject接口,

让Proxy代理类实现该接口,这样外界可以通过代理对象直接使用RealSubject的功能。

 

实体类可以将自己的不同功能代理出去,这样实体类只跟代理类耦合,外界只跟代理类耦合。

代理类相当于一个中介者。并可适当地添加或优化某些调用。


下面代码展示的是代理恋爱(@_@!)由于追求者使用代理人来实现自己送礼物的功能

被追求的女同学不需知道到底是谁在追求她,她只负责接收礼物。


代码如下:

/*****************************************************
* 模式名:代理模式
* 时间:2010.6.4
*                                       -by gouki04
*****************************************************/

#pragma once

#include <string>

//
class cSchoolGirl;	// 女学生类
class IGiveGift;	// 送礼物接口
class cPursuit;		// 追求者
class cProxy;		// 代理类
//

// 女学生类
// 相当于client类
class cSchoolGirl
{
private:
    std::string m_name; // 姓名

public:
    std::string GetName() const { return m_name; }
    void SetName(std::string name) { m_name = name; }
};

// 送礼物接口
// 相当于Subject类,定义了实体和代理的公共接口
class IGiveGift
{
public:
    virtual std::string GiveDolls() = 0;
    virtual std::string GiveFlowers() = 0;
    virtual std::string GiveChocolate() = 0;
};

// 追求者
// 相当于RealSubject类,实际工作的类
class cPursuit : public IGiveGift
{
private:
    cSchoolGirl * m_mm;

public:
    cPursuit(cSchoolGirl* mm) : m_mm(mm) {}
    std::string GiveDolls() { return m_mm->GetName() + std::string(" 送你洋娃娃"); }
    std::string GiveFlowers() { return m_mm->GetName() + std::string(" 送你鲜花"); }
    std::string GiveChocolate() { return m_mm->GetName() + std::string(" 送你巧克力"); }
};

// 代理类
// 即Proxy类,主要的功能是代理RealSubject接受外界的调用
// 使得减少了RealSubject与外界的耦合
class cProxy : public IGiveGift
{
private:
    cPursuit * m_gg;

public:
    cProxy(cSchoolGirl* mm) { m_gg = new cPursuit(mm); }
    // 代理的时候可以添加一点额外的功能,例如多加一句“你好”
    std::string GiveDolls() { return std::string("你好,") + m_gg->GiveDolls(); }
    std::string GiveFlowers() { return std::string("你好,") + m_gg->GiveFlowers(); }
    std::string GiveChocolate() { return std::string("你好,") + m_gg->GiveChocolate(); }
};

// 测试的main函数
// int main()
// {
// 	using namespace std;
// 
// 	cSchoolGirl jiaojiao;
// 	jiaojiao.SetName("李娇娇");
// 
// 	cProxy daili(&jiaojiao);
// 
// 	cout<<daili.GiveDolls()<<endl;
// 	cout<<daili.GiveFlowers()<<endl;
// 	cout<<daili.GiveChocolate()<<endl;
// 
// 	return 0;
// }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值