代理模式

应用场景

    代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。客户端分辨不出代理主题对象与真实主题对象。
    代理模式也可以并不知道真正的被代理对象,而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,被代理对象必须由系统的其他角色代为创建并传入。

优缺点

  • 职责清晰:真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
  • 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
  • 高扩展性

代理模式与装饰器模式的区别

代理模式:

  • 强调的是控制访问。即在不改变接口的前提下,控制对象的访问,可以增加方法的行为,甚至彻底改变行为。比如下述的实例当中,代理更改了被代理对象的功能,并且控制了被代理对象的访问。

装饰模式:

  • 强调的是功能的扩充。即在不改变接口的前提下,动态扩展对象的功能,但不饿能修改原方法的行为。比如之前介绍过的装饰模式实例,无论给Person装饰什么衣服,但是Person自身的show方法都没有改变,只能增加功能,不能修改功能。

ps:此处仅限个人理解,如有错误请留言。

Java的三种代理

    具体可参考Java的三种代理模式

实例(C++实现静态代理)

#include <iostream>
#include <string>
using namespace std;
//客户端分辨不出代理主题对象与真实主题对象。
//代理模式可以并不知道真正的被代理对象,
//而仅仅持有一个被代理对象的接口,这时候代理对象不能够创建被代理对象,
//被代理对象必须有系统的其他角色代为创建并传入。

class SchoolGirl
{
public:
	string name;
};


class IGiveGift
{
public:
	virtual void giveDolls() = 0;
	virtual void giveFlowers() = 0;
};

class Pursuit :public IGiveGift
{
private:
	SchoolGirl mm;
public:
	Pursuit(SchoolGirl m)
	{
		mm = m;
	}
	void giveDolls()
	{
		cout << mm.name << " 送你娃娃" << endl;
	}
	void giveFlowers()
	{
		cout << mm.name << " 送你鲜花" << endl;
	}
};

class Proxy :public IGiveGift
{
private:
	Pursuit gg;
public:
	Proxy(SchoolGirl mm) :gg(mm)
	{
		//gg=g;
	}
	void giveDolls()
	{
		gg.giveDolls();
	}
	void giveFlowers()
	{
		gg.giveFlowers();
	}
};

int mai12312321n()
{
	SchoolGirl lijiaojiao;
	lijiaojiao.name = "李娇娇";
	Pursuit zhuojiayi(lijiaojiao);
	Proxy daili(lijiaojiao);

	daili.giveDolls();
	cin.get();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值