1 package com.cnblogs.vincentzh.staticproxy; 2 // 创建代理(中介)角色,与房东实现相同接口 3 public class Proxy implements RentOut 4 { 5 private HouseHolder houseHolder; // 代理角色内部含有真实角色的引用 6 7 // 重写租房方法,添加中介操作 8 @Override 9 public void rent() 10 { 11 this.preRentOut(); // 代理对象添加自己的操作 12 13 if(null == houseHolder) 14 { 15 houseHolder = new HouseHolder(); 16 } 17 houseHolder.rent(); 18 19 this.postRentOut(); // 代理对象添加自己的操作 20 } 21 22 // 中介操作,租房前收中介费 23 public void preRentOut() 24 { 25 System.out.println("I need more money!"); 26 } 27 28 // 中介操作,租房后扣押金 29 public void postRentOut() 30 { 31 System.out.println("I will deduct some money!"); 32 } 33 }
创建真实环境类,实现代理功能。
客户对象并不知道被代理的真实对象,只知道自己需要进行某项操作,并且某个代理能帮助自己完成这一操作。(即客户要租房子,并不知道要从哪个房东手里租房,只知道中介能帮助自己租到房子,至于房子从哪个房东那里租的,就是中介(代理)的事儿了,客户并不知道,也不需要直到)。
1 package com.cnblogs.vincentzh.staticproxy; 2 // 租房客户类 3 public class Client 4 { 5 /** 6 * @param args 7 */ 8 public static void main(String[] args) 9 { 10 // 涉世未深的小年轻要租房,苦于联系不到房东,只能通过中介 11 RentOut rentOut = new Proxy(); 12 rentOut.rent(); 13 } 14 }
运行程序,客户类通过代理访问真实角色,不仅实现真实角色的操作行为,同时也添加了代理自己的操作行为。
静态代理的弊端就在于:每当有一个真实对象需要被代理,就需要创建一个新的代理类,因为代理类内含有对真实对象的引用,代理类需要与真实对象一一对应。这样,当需要代理的真实对象比较多时,代理类就会急剧增加,增加了代码的复杂性,使代码变得尤其繁重,不易维护。那么动态代理就很好的解决了这一问题。
5.2 动态代理动态代理解决了静态代理存在的弊端,实现了多个被代理真实对象仅由一个代理类代理即可。
1)创建两个行为接口,分别实现 rent、sale 不同操作的行为;
1 package com.cnblogs.vincentzh.dynamicproxy; 2 // 创建租房接口 3 public interface Rent 4 { 5 public void rent(); 6 }
1 package com.cnblogs.vincentzh.dynamicproxy; 2 // 创建售卖接口 3 public interface Sale 4 { 5 public void sale(); 6 }
2)创建两个需要被代理的真实对象类,且他们分别实现了含有不同操作行为的接口;