代理模式(Proxy Model)

6、总结

1、写在前面

  这次写代理模式,代理模式里面的动态代理(Dynamic Proxy)逻辑稍显混乱,不太容易理解,本章节会将代理模式里面的静态代理(Static Proxy)和动态代理(Dynamic Proxy)结合对比理解,其中动态代理的实现需要具备 Java 的反射(Reflection)知识,原理方面会结合实例和静态代理的对比尽量说清楚。

2、概述

  在某些情况下,一个客户不想或者不能直接引用一个对象,代理对象就再客户端和被代理对象之间起到中介的作用。就好比你在北京租房,初来乍到,人生地不熟,找房子遍地都是中介,想找房东可没那么容易(基本算得上是找不到房东直租的)。问题来了,找不到房东直租,但房子又是一切的基础,so....走中介,房东能租房,中介也能租房,不过是你通过中介去将房东的房子租给自己。OK,这就是一个活生生的代理模式的例子,相必在外漂泊的小年轻们都感同身受吧。

  再说说代理模式的分类,代理模式主要分为两类:静态代理(Static Proxy)动态代理(Dynamic Proxy)

 静态代理:一个被代理的真实对象对应一个代理,相当于一个租房中介只代理一个房东。弊端很明显,这样下去中介早饿死了!!!并且中介公司管理这么庞大的中介团队早晚逗得垮掉。反应到代码里面就是:代理类急剧增加,灵活性降低,增加了代码的复杂度。

动态代理:动态代理主要是去解决静态代理存在的问题(及一个代理对应一个被代理对象),现实中也是这样,不可能有中介只做一个房东的生意,一个中介手里n多房子供你选择,3人间、6人间、隔断、小两居等各种房源。反应到代码里面:代理类只有一个,根据客户需求动态的去改变代理的真实对象,增加了代码的灵活性,降低了代码的复杂性。

3、目的

  代理模式的目的在于:为其他对象提供一种代理的方式控制被代理对象。

4、结构组成

  代理模式主要涉及到三个角色:抽象角色、代理角色、真实角色(被代理的角色)。

 抽象角色:声明真实对象和代理对象的共同接口。即真实对象和代理对象共同要实现的行为动作(好比房东和中介都要能够实现租房的行为,都能把房子租给你)。

 代理角色:代理角色内部含有对真实角色的引用,从而可以去操作真实对象,同时代理对象提供与真实对象的接口,以便在任何时候都能代替真实对象。同时,代理对象在执行真实对象的操作时,也能附加它自己的操作,相当于对真实对象的封装(可以理解为中介在执行将房东的房子租给你这一操作时,可以向你收取中介费,还可以在退房的时候扣你押金这类房东不具有的操作)。

 真实角色:代理角色所代理的对象,亦即我们最终要引用的对象。

5、实现   5.1 静态代理

    静态代理主要涉及到的三个角色关系图如下:

    代理角色和真实角色都要实现同一个操作行为接口(或继承同一个抽象类),并且代理角色依赖于真实角色,因为代理角色内部有对真实角色的引用,代理在操作真实角色去执行动作时,必须要知道是哪  个真实角色。

    

    下面是静态代理的实现:

      声明抽象角色和代理角色实现的共同接口。     

1 package com.cnblogs.vincentzh.staticproxy; 2 //声明出租房屋接口 3 public interface RentOut 4 { 5 public void rentOut(); 6 }

   创建真实角色,实现租房接口。

1 package com.cnblogs.vincentzh.staticproxy; 2 // 创建房主类(真实角色) 3 public class HouseHolder implements RentOut 4 { 5 @Override 6 public void rent() 7 { 8 System.out.println("I’m renting the house!"); 9 } 10 }  

   创建代理角色,实现与真实角色相同的接口

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/071ee9bf087ba3e8a75907b2517d832b.html