大话设计模式C++版本-04-代理模式

本文深入探讨了代理模式的概念及其应用场景,通过一个追求者送礼的例子详细解释了如何通过代理类来控制对目标对象的访问,同时提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

代理模式:为其他对象提供一种代理以控制对这个对象的访问

使用场景

  1. 想在访问一个类时做一些控制;
  2. 直接访问对象时会带来的问题,比如说:要访问的对象在远程的机器上。

一般步骤

  1. 被代理者代理者的共同行为抽象出来作为一个类;
    class GiveGift // 送礼物类
    {
    public:
    	virtual	void GiveDolls() = 0;
    	virtual	void GiveFlowers() = 0;
    	virtual	void GiveChocolate() = 0;
    };
    
  2. 被代理者的类;
    class Pursuit : public GiveGift // 被代理者-追求者类
    {
    public:
    	Pursuit(SchoolGirl *mm)
    	{
    		this->mm = mm;
    	}
    	void GiveDolls()
    	{
    		cout << mm->name << "送你洋娃娃" << endl;
    	}
    	void GiveFlowers()
    	{
    		cout << mm->name << "送你鲜花" << endl;
    	}
    	void GiveChocolate()
    	{
    		cout << mm->name << "送你巧克力" << endl;
    	}
    private:
    	SchoolGirl *mm; 
    };
    
  3. 代理者类,里面的行为全部调用被代理者的行为;
    class Proxy : public GiveGift // 代理类
    {
    public:
    	Proxy(SchoolGirl *mm)
    	{
    		gg = new Pursuit(mm);
    	}
    	void GiveDolls()
    	{
    		gg->GiveDolls();
    	}
    	void GiveFlowers()
    	{
    		gg->GiveFlowers();
    	}
    	void GiveChocolate()
    	{
    		gg->GiveChocolate();
    	}
    private:
    	Pursuit	*gg; // 被代理者
    };
    

具体实例

// 04Proxy.cpp
#include <iostream>
#include <string>

using namespace std;

class SchoolGirl // 女孩类
{
public:
	SchoolGirl(string name)
	{
		this->name = name;
	}
	string name;
};

class GiveGift // 送礼物类
{
public:
	virtual	void GiveDolls() = 0;
	virtual	void GiveFlowers() = 0;
	virtual	void GiveChocolate() = 0;
};

class Pursuit : public GiveGift // 被代理者-追求者类
{
public:
	Pursuit(SchoolGirl *mm)
	{
		this->mm = mm;
	}
	void GiveDolls()
	{
		cout << mm->name << "送你洋娃娃" << endl;
	}
	void GiveFlowers()
	{
		cout << mm->name << "送你鲜花" << endl;
	}
	void GiveChocolate()
	{
		cout << mm->name << "送你巧克力" << endl;
	}
private:
	SchoolGirl *mm; 
};

class Proxy : public GiveGift // 代理类
{
public:
	Proxy(SchoolGirl *mm)
	{
		gg = new Pursuit(mm);
	}
	void GiveDolls()
	{
		gg->GiveDolls();
	}
	void GiveFlowers()
	{
		gg->GiveFlowers();
	}
	void GiveChocolate()
	{
		gg->GiveChocolate();
	}
private:
	Pursuit	*gg; // 被代理者
};

int main()
{
	SchoolGirl *jiaojiao = new SchoolGirl("李娇娇");
	
	Proxy *DaiLi = new Proxy(jiaojiao);
	
	DaiLi->GiveDolls();
	DaiLi->GiveFlowers();
	DaiLi->GiveChocolate();
	
	return 0;
}

参考资料

《大话设计模式》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wkd_007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值