设计模式(四)代理模式(Proxy Pattern)

key:代理模式通过提供代理来控制对象的访问。

这里的“控制”我理解:
一、可以用来控制对象的加载时间,在需要的时候才生成真正的对象,这样可以实现延迟加载,提高系统的效率,例如一个规模较大的系统如果一开始就全部初始化全部所需的资源,那么可能用户等待的时间很长,使得用户体验不好。这个时候可以用代理来实现快速的加载,原理可以参考下面的具体例子。

二、可以控制对象的权限,在处理对象之前做一些校验身份的工作,可能不同的用户身份得到不同的服务,例如网站的登录用户和未登录用户,同样操作可能得到的是不同的结果。

三、可以在一些其他附加的功能,例如记录系统日志,通知某些进程触发事件等。这样的话可以让这个需要代理的对象专注与于自己的核心功能,实现单一职责。这样可以降低模块之间的耦合度,方便以后系统的维护。


在代理模式中有两个对象参与处理同一请求,接收的请求由代理对象委托给真实对象处理,代理对象控制请求的访问,它在客户端与真实目标对象之间起到一个中介桥梁的作用。代理模式使用对象聚合代替继承,有效的降低了软件模块之间的耦合度。代理模式中涉及的角色有以下三种:
(1)抽象角色:声明对象和代理对象的公共接口。
(2)真实角色:真正处理请求的目标对象。
(3)代理角色:代理对象内部含有真实对象的指针或引用,从而代理对象可以将请求转为真实对象处理。同时代理对象在执行真实对象操作前后还可以添加附加操作。

代理模式非常普遍,它在处理一些延迟加载和对对象的访问控制上显得非常有效。一个具体的例子:一个可以在文档中嵌入图形对象的文档编辑器。有些图形对象的创建开销很大。但是打开文档必须很迅速,因此我们在打开文档时应避免一次性创建所有开销很大的对象。这里就可以运用代理模式,在打开文档时,并不打开图形对象,而是打开图形对象的代理以替代真实的图形。待到真正需要打开图形时,仍由代理负责打开。下面是类图:

 

 

代码:

#include <iostream>
#include <string>
using namespace std;

class Image
{
        public:
                virtual void show() = 0;
};

class BigImage:public Image
{
        public:
                //这里的show可以完成加载图像这样复杂的功能
                void show(){cout<<"An big image"<<endl;};
};

class BigImageProxy:public Image
{
        public:
                void show()
                {
                        //当调用的时候才真正加载BigImage对象
                        //这里可以增加校验、日志等功能,使得BigImage功能单一
                        m_image = new BigImage();
                        m_image->show();
                };
        private:
                Image *m_image;
};

int main()
{
        Image *image = new BigImageProxy();
        image->show();
        return 0;
}


// add 2013-8-5

        代理模式和适配器模式区别,代理模式所代理的对象接口与代理接口一样,提供一些别的功能。而适配器模式的主要目的是为了使类接口匹配,如果适配器使用组合实现,那么代理模式和适配器模式可能实现一样,只是目的不同。

        代理模式与中介模式区别,中介者模式是引入另外 一个类来把类之间的复杂关系独立出来,跟代理模式关系不大,只是中文名字有点相似。

参考:
设计模式那点事
设计模式:可复用面向对象软件的基础

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值