第七章 为别人做嫁衣-代理模式(读书笔记)

本文通过示例详细介绍了代理模式的应用场景及实现方式,包括远程代理、虚拟代理等,并提供了具体的代码实现。

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

为别人做嫁衣-代理模式

1.代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
2.远程代理,也就是为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不用地址空间的事实。
3.虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真实对象。打开网页时代理存储了真实图片的路径和尺寸,这个就是虚拟代理。
4.安全代理:用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。
5.智能指引:是指当调用真实的对象时,代理处理另外一些事。如计算真实对象的引用次数。

 7.2 在没有代理模式的情况下

7.2.1  SchoolGirl.h

#pragma once
#include <string>

class SchoolGirl
{
public:
	void SetName(std::string str)
	{
		m_Name = str;
	};

	std::string GetName(void)
	{
		return m_Name;
	};
private:
	std::string m_Name;
};

7.2.2  Pursuit.h

#pragma once 
#include <iostream>
#include "SchoolGirl.h"

class Pursuit
{
public:
	Pursuit(SchoolGirl* mm)
	{
		m_mm = mm;
	};

	void GiveDolls()
	{
		std::cout << m_mm->GetName() << "送你洋娃娃" << std::endl;
	};
	
	void GiveFlower()
	{
		std::cout << m_mm->GetName() << "送你鲜花" << std::endl;
	};

	void GiveChocolate()
	{
		std::cout << m_mm->GetName() << "送你巧克力" << std::endl;
	};
private:
	SchoolGirl* m_mm;
};

7.2.3  调用的客户端

#include "stdafx.h"
#include "Pursuit.h"

int _tmain(int argc, _TCHAR* argv[])
{
	SchoolGirl* jiaojiao = new SchoolGirl();
	jiaojiao->SetName("李娇娇");
	
	//事实上娇娇并不认识卓贾易
	Pursuit* zhuojiayi = new Pursuit(jiaojiao);
	zhuojiayi->GiveChocolate();
	zhuojiayi->GiveDolls();
	zhuojiayi->GiveFlower();

	delete jiaojiao;
	delete zhuojiayi;
	return 0;
}

7.3  代理模式来了,但是在这里只是换了个名字而已。不是真正的代理。 

7.3.1  SchoolGirl.h同上,不做修改

7.3.2  Proxy.h

#pragma once
#include "SchoolGirl.h"
#include <iostream>

class Proxy
{
public:
	Proxy(SchoolGirl* mm)
	{
		m_mm = mm;
	};

	void GiveDolls()
	{
		std::cout << m_mm->GetName() << "送你洋娃娃" << std::endl;
	};
	
	void GiveFlower()
	{
		std::cout << m_mm->GetName() << "送你鲜花" << std::endl;
	};

	void GiveChocolate()
	{
		std::cout << m_mm->GetName() << "送你巧克力" << std::endl;
	};
private:
	SchoolGirl* m_mm;
};

7.3.3  调用的客户端

#include "stdafx.h"
#include "Proxy.h"

int _tmain(int argc, _TCHAR* argv[])
{
	SchoolGirl* jiaojiao = new SchoolGirl();
	jiaojiao->SetName("李娇娇");

	Proxy* daili = new Proxy(jiaojiao);
	daili->GiveChocolate();
	daili->GiveDolls();
	daili->GiveFlower();

	return 0;
}


7.4  代理模式

    GiveGift是一个接口类,接口的内容就是送礼物的函数, 在类Pursuit中实现这些送礼物的函数.在代理类中控制类Pursuit的新规和消亡.当调用代理类的送礼物函数的时候,通过代理中保有的Pursuit调用类Pursuit的送礼物函数,再通过调用Pursuit类中的m_mm指针找到李娇娇.

7.4.1  SchoolGirl.h同上,没有修改

7.4.2  Pursuit.h

#pragma once
#include "SchoolGirl.h"
#include <iostream>

class GiveGift
{
	virtual void GiveDolls(void) = 0;
	virtual void GiveFlower(void) = 0;
	virtual void GiveChocolate(void) = 0;
};

//追求者去实现礼物接口
class Pursuit :public GiveGift
{
public:
	Pursuit(SchoolGirl* mm)
	{
		m_mm = mm;
	};

	void GiveDolls()
	{
		std::cout << m_mm->GetName() << "送你洋娃娃" << std::endl;
	};
	
	void GiveFlower()
	{
		std::cout << m_mm->GetName() << "送你鲜花" << std::endl;
	};

	void GiveChocolate()
	{
		std::cout << m_mm->GetName() << "送你巧克力" << std::endl;
	};
private:
	SchoolGirl* m_mm;
};

//代理类
class Proxy
{
public:
	Proxy(SchoolGirl* mm)
	{
		m_gg = new Pursuit(mm);
	};

	~Proxy()
	{
		if (m_gg != NULL)
		{
			delete m_gg;
			m_gg = NULL;	
		}	
	};
	void GiveDolls()
	{
		m_gg->GiveDolls();
	};
	
	void GiveFlower()
	{
		m_gg->GiveFlower();
	};

	void GiveChocolate()
	{
		m_gg->GiveChocolate();
	};
private:
	Pursuit* m_gg;
};

7.4.3  调用的客户端, 代理在知道李娇娇以后,就可以直接送礼物了.

#include "stdafx.h"
#include "Pursuit.h"

int _tmain(int argc, _TCHAR* argv[])
{
 SchoolGirl* jiaojiao = new SchoolGirl();
 jiaojiao->SetName("李娇娇");

 Proxy* daili = new Proxy(jiaojiao);
 daili->GiveChocolate();
 daili->GiveDolls();
 daili->GiveFlower();
 return 0;
}


7.6 代理模式的教科书代码,要在代理中封装真实对象的创建和消亡.最好接口的名字用同一个,这样就不会弄错.

7.6.1  Subject.h

#pragma once

class Subject
{
public:
	virtual void Request(void) = 0;
};

7.6.2  RealSubject.h

#include "subject.h"
#include <iostream>

class RealSubject : public Subject
{
public:
	void Request(void)
	{
		std::cout << "真实的请求" << std::endl;
	};
};

7.6.3  Proxy.h

#pragma once
#include "realsubject.h"

class Proxy : public Subject
{
public:
	Proxy()
		:m_realSubject(NULL)
	{
	}
	void Request(void)
	{
		if (m_realSubject == NULL)
		{
			m_realSubject = new RealSubject();
		}
		m_realSubject->Request();
	};
private:
	RealSubject* m_realSubject;
};

7.6.5 客户端调用

#include "stdafx.h"
#include "Proxy.h"


int _tmain(int argc, _TCHAR* argv[])
{
	Proxy* daili = new Proxy();
	daili->Request();

	delete daili;
	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

进击的横打

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

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

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

打赏作者

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

抵扣说明:

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

余额充值