要学习c++代理设计模式式之代理模式怎么学

  不直接操作实体对象,而是借助另外一个对象来操作它,这样的话,我们可以在实体对象编写核心代码,而用代理对象来编写条件等等,如果满足就访问实体对象。这样的话当你不需要条件的时候,我们只是需要把代理对象删除,其他的都不不用去改变。简单来讲所谓的代理模式就是通过另外一个人来帮它完成一部分的任务,减轻压力。如下:
var sayHello = function(){
  console.log('Hello World');};
var cHello = function(name){
  if(name==='老王'){
    sayHello();
cHello('老王'); //Hello WorldcHello('老李');
  sayHello是核心代码,而cHello是代理,比如原本项目的需求是不管是访问sayHello都执行console.log而需求有些变化,只有老王访问的时候才执行sayHello。如果下次再改变我们只需要动代理类就行,而不需要去修改核心的类,突然发现其实这种很有好处的,比如你根本一开始就不需要去考虑代理,但项目需要更改的时候再去写代理类,也是一样的,哈。
  使用代理模式的另外一个好处就是,比如页面中我们不一定一开始就需要加载所有的JS代码,一部分是根据一些情况才进行加载的,但我们又允许用户提前是使用这些功能,这个时候我们就可以设计一个代理类,让用户来访问这个代理类,将数据保存到代理类里面,而到需要的时候再访问实际的类。
var sayHello = function(){
  console.log('Hello World');};
var cHello = function(){
  setTimeout(function(){
    sayHello();
  },2000)};
cHello(); //Hello World
  多少有些像亡羊补牢的感觉,一步一步的加条件。
  另外使用代理模式配合缓存机制可以极大的提高性能,比如我们可以通过代理来保存一些数据,如果这个数据已经技术过了那么我们直接返回这个数据,如果没有计算过那么再访问源对象进行计算。
//核心var count = function(){
  var a = 0;
  for(var i=0,c;c=arguments[i++];){
    a+=c; //c = arguments[i]
//代理var fcount = (function(){
  //保存缓存的数据
  var obj = {};
  return function(){
    var arg =
    var temp = Array.prototype.join.call(arg,',');
    if(temp in obj){
      console.log('ok');//用来测试是否有使用缓存的数据
      return obj[temp];
    return obj[temp] = count.apply(null,arg);
console.log(fcount(2,3)); //5console.log(fcount(2,3)); //ok 5console.log(fcount(2,3,5));//10console.log(fcount(2,3,5));// ok 10
  总之代理模式还是很有意思的,你可以先去实现核心代码,如果项目比较赶你也可以不使用代理来访问,有时间的话去优化。
  其实这些说的都是一个意思,就是核心的不动,修改的只是代理类。
阅读(...) 评论()C++设计模式编程中proxy代理模式的使用实例
代理模式典型的结构图为:
实际上,代理模式的想法非常简单。
代理模式的实现:
完整代码示例(code):代理模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用 C++实现,并在 VC 6.0 下测试运行)。
代码片断 1:Proxy.h
#ifndef _PROXY_H_
#define _PROXY_H_
class Subject{
virtual ~Subject();
virtual void Request() = 0;
protected:
Subject();
class ConcreteSubject:public Subject{
ConcreteSubject();
~ConcreteSubject();
void Request();
protected:
class Proxy{
Proxy(Subject* sub);
void Request();
protected:
Subject* _
#endif //~_PROXY_H_
代码片断 2:Proxy.cpp
//Proxy.cpp
#include "Proxy.h"
#include &iostream&
Subject::Subject(){
Subject::~Subject(){
ConcreteSubject::ConcreteSubject(){
ConcreteSubject::~ConcreteSubject(){
void ConcreteSubject::Request(){
cout&&"ConcreteSubject......request
Proxy::Proxy(){
Proxy::Proxy(Subject* sub){
Proxy::~Proxy(){
void Proxy::Request(){
cout&&"Proxy request...."&&
_sub-&Request();
代码片断 3:main.cpp
//main.cpp
#include "Proxy.h"
#include &iostream&
int main(int argc,char* argv[]){
Subject* sub = new ConcreteSubject();
Proxy* p = new Proxy(sub);
p-&Request();
代码说明:代理模式的实现很简单,这里不做多余解释。可以看到,示例代码运行后,p 的 Request 请求实际上是交给了 sub 来实际执行。
再来看一个例子:
#include &iostream&
#include &string&
class Receiver
Receiver(string name):name(name)
string GetName()
class Subject
virtual void display(){}
class Sender:public Subject
Receiver *
void SetReceiver(Receiver *someone)
this-&someone =
virtual void display()
cout&&"i hate you:" && someone-&GetName()&&
class Proxy:public Subject
void SetClient(Subject *client)
this-&realobject =
void display()
realobject-&display();
int main()
Receiver *recv = new Receiver("nobody");
Sender *obj
obj-&SetReceiver(recv);
Proxy *proxy = new P
proxy-&SetClient(obj);
proxy-&display();
system("pause");
由此可见,代理模式最大的好处就是实现了逻辑和实现的彻底解耦。
顶一下(0) 踩一下(0)
热门标签:1135人阅读
最常用的设计模式(11)
代理模式:为其他对象提供一种代理以控制对这个对象的访问。这样实现了业务和核心功能分离。
& & & &Subject: 抽象角色。声明真实对象和代理对象的共同接口。
& & & &Proxy: 代理角色。代理对象与真实对象实现相同的接口,所以它能够在任何时刻都能够代理真实对象。代理角色内部包含有对真实对象的引用,所以她可以操作真实对象,同时也可以附加其他的操作,相当于对真实对象进行封装。
& & & &RealSubject: 真实角色。它代表着真实对象,是我们最终要引用的对象
& &假若你有一个工厂开始是生产手机的,但是它现在不想自己生产了,它把自己的东西交给了一家代工厂富士康去生产,那么便有了下面的代码去构建。
统一的抽象接口 IFactory
class IFactory
IFactory(){}
virtual void makeProduct() = 0;
你的手机工厂
class PhoneFactory : IFactory
PhoneFactory(){}
void makeProduct()
cout&&&生产手机&&&
专门做代工的代理工厂富士康
class FoxconnProxy : IFactory
FoxconnProxy(IFactory* factory)
void makeProduct()
m_real-&makeProduct();
IFactory* m_
IFactory* factory = new PhoneFactory();
FoxconnProxy* proxy =
new FoxconnProxy(factory);
proxy-&makeProduct();
& & 看了uml图和上面的代码你会可能会发现,先访问代理类再访问真正要访问的对象。似乎这样有点多此一举的味道,其实不然。代理类可以在真正的类执行之前,进行预处理。 比富士康生产的手机之前可能会坚持元器件是否合格,不合格就不生产等。在比如你有一个系统实现了登陆功能,在用户登录时,
真正的登录类和代理登录类都实现了Login接口, 不同的是Proxy类的方法中增加了用户是否合法的判断, 只有合法时才去调用真正登录类的login方法. 用户访问的其实是Proxy的login方法.这都是代理模式的优点。而且采用代理模式的话,并且你可以随时更改代理。还有一点你会发现,真正对象与代理他们实现同一个接口。
& &这个模式和装饰者模式有点类似之处,都是包装,但是请注意他们应用场景不一样:一个是动态的给类添加职责,一个是控制对这个对象的访问。最重要的一点不同是他们的结构不同,你对比下两个模式的uml图便知。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:71025次
排名:千里之外
原创:20篇
评论:43条
(1)(7)(5)(2)(1)(1)(2)(7)(1)&代理模式的作用和注意事项
代理模式的作用和注意事项
开通极客学院VIP会员,免费观看全部会员课程
最低 21.6 元 / 月
VIP会员尊享特权
观看全部会员课程
720P高清视频下载
已有会员账号,请
视频太卡?试试切换线路
本课时介绍一下代理模式的课程概要,让同学们了解本节课要学习的知识点。
本课时介绍代理模式的概念,分为文字解读和拟物化方式解读,让大家更好的了解代理模式。
本课时介绍一下代理模式的作用和注意事项,让同学们知道代理模式具体的应用场景和所需要注意的地方。
本课时对代理模式进行代码实战和总结。
只有成为VIP会员才能提问&回复,快吧!如果你还没有账号你可以一个账号。
添加新技术问题
课程 [代理模式的作用和注意事项]
中已存在问题
添加新技术问题
问题描述越详细,被解答的速度越快
有新回答时请邮件提醒我
着急,拜托快点
不急,慢慢解决
关联课程 [代理模式的作用和注意事项]
服务热线:400-678-8266

我要回帖

更多关于 java设计模式面试题 的文章

 

随机推荐