设计模式学习笔记(五)之代理模式(Proxy)

          设计模式学习笔记(五)之代理模式(Proxy):

    

      1:定义与作用:为其他对象提供一种代理以控制对这个对象的访问。

        

      2:代理模式一般涉及到的角色有以下三个:

  • 抽象角色:声明真实对象和代理对象的共同接口;
  • 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装;
  • 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象;
         
     3:代理模式(Proxy的结构图):
      
        
           
   

         从上面的结构类图可以看出,代理类(Proxy)和真实角色类(RealSubject)都实现了抽象角色类,这样由于 Proxy 和 RealSubject 均实现自 Subject 这个抽象角色类,并且在 Proxy 和 RealSubject 中均实现了 Request 方法,所以在需要使用 RealSubject 的地方便可以使用 Proxy 来替代,由于使用了 Proxy 来替代 RealSubject ,所以便实现了通过 Proxy 来代理 RealSubject ;看还是挺好理解的吧(*^__^*) 

        

       4:下面我们使用租房子的一个小例子来模拟代理模式

         (在其中:房子的主人为:真实角色RealSubject;中介为:代理角色Proxy;作为要去租房子的我们,我们平时一般见不到房子的主人,此时我们去找中介,让中介直接和找房主交涉,把房子租下来,直接跟租房子打交道的是中介。中介就是在租房子的过程中的代理者),看下结构图:

          

         

         

       下面来看代码:

       ①:抽象角色:Rent.java

       

package com.jiangqq.proxy1;

//抽象角色,定义真实角色和代理角色的共同接口
public interface Rent {
    public void order();
}
        

     ②:真实角色类:RentReal.java

      

package com.jiangqq.proxy1;
//真实角色,去执行确定房子租
public class RentReal implements Rent {
	@Override
	public void order() {
      System.out.println("租房子OK....");
	}

}
         

        ③:代理角色类:RentProxy.java

       

package com.jiangqq.proxy1;
//代理角色,在代理角色内部,使用真实角色的应用去执行自己的order()角色,这样租房子
public class RentProxy implements Rent {
	//在代理的角色的内部去引用真实的角色
	private RentReal realSubject;
	@Override
	public void order() {
        if(realSubject==null)
        {
        	realSubject=new RentReal();
        	beforeProxy();
        	//使用真实角色去完成所需要的事情
        	realSubject.order();
        	afterProxy();
        }     
	}
	//真实角色的操作之前去执行,不是必须要有
	private void beforeProxy()
	{
		System.out.println("beforeProxy...");
	}
	//真实角色的操作之后去执行,不是必须要有
	private void afterProxy()
	{
		System.out.println("afterProxy...");
	}
}
               

              ④:客户端测试类代码:

  

package com.jiangqq.proxy1;
//代理模式的测试客户端
public class Client {
  public static void main(String[] args) {
	  Rent proxySubject=new RentProxy();
	  proxySubject.order();
  }
}

             Client执行的结果如下:


           

         看上面的代码,我们可以清楚的看出来,在客户端实际调用的是RentReal(真实角色)的order()方法,现在我们可以使用RentProxy(代理角色)去调用进行处理,当然我们大家都知道,作为中介肯定要赚钱来(话说不赚钱中介凭什么帮你去租房子呢?嘿嘿),所以我们看到在RentProxy.java中还定义了两个私有的方法,当然也可以不定义啦,就可以说此刻的中介的人真好,服务之后不收钱了,免费了一次,如果真这样,那这世界还真美好~~~

       

        5:代理模式在实际情况中的应用(以下是我在《大话设计模式》书中摘录的):

    

        ①:远程代理:就是一个对象在不同的地址空间提供局域代表,这样可以掩盖一个对象存在不同地址空间的事实;

        ②:虚拟代理:就是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象;

        ③:安全代理:用来控制真实对象访问时的权限;

        ④:智能代理:是指调用真实的对象时,代理处理另外一些事情;



       例子的代码下载链接:http://download.csdn.net/detail/jiangqq781931404/4201822






    

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的C++代码示例,演示了如何使用代理模式: 首先,定义一个接口,作为代理和实际对象的共同接口: ```c++ class Image { public: virtual void display() = 0; }; ``` 然后,实现接口的实际对象: ```c++ class RealImage : public Image { private: std::string fileName; public: RealImage(std::string fileName) { this->fileName = fileName; loadFromDisk(fileName); } void display() override { std::cout << "Displaying " << fileName << std::endl; } void loadFromDisk(std::string fileName) { std::cout << "Loading " << fileName << std::endl; } }; ``` 接下来,实现代理对象,代理对象会在调用实际对象前进行一些额外操作: ```c++ class ProxyImage : public Image { private: RealImage* realImage; std::string fileName; public: ProxyImage(std::string fileName) { this->fileName = fileName; } void display() override { if (realImage == nullptr) { realImage = new RealImage(fileName); } realImage->display(); } }; ``` 最后,我们可以使用代理对象来访问实际对象,代理对象会在访问实际对象前进行一些额外操作,比如加载图片: ```c++ int main() { Image* image = new ProxyImage("test.jpg"); // 图像从磁盘加载 image->display(); std::cout << std::endl; // 图像不需要从磁盘加载 image->display(); } ``` 输出为: ``` Loading test.jpg Displaying test.jpg Displaying test.jpg ``` 在这个例子中,我们使用代理对象来控制访问实际对象,代理对象会在访问实际对象前进行一些额外操作,比如加载图片。这种设计模式可以用来实现远程代理、虚拟代理、保护代理等功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值