最近公司从新开发一个项目,为此对老的代码进行评估分析发现有些地方是可以采用代理模式来进行的,为此对代理模式进行了一次理解:
代理模式:即为指定的目标对象提供一个代理商,由代理商来完成对目标对象的操作。
代理类图:
抽象对象角色或者接口角色:声明了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方就都可以使用代理对象。
目标对象角色:定义了所需要代理对象的真实对象。
代理对象角色:代理对象内部含有目标对象的引用,从而可以在任何时候操作目标对象;代理对象通常在客户端调用目标对象之前或之后,执行某个操作,而不是单纯直接调用真实对象。
接口:
public interface Subject { void doSomething(); }
目标对象角色:
package com.njupt.study.designmodle.proxy; public class RealSubject implements Subject { @Override public void doSomething() { System.out.println("做些什么呢?"); } }
代理对象角色:
package com.njupt.study.designmodle.proxy; public class ProxySubject implements Subject { private RealSubject realSubject; public ProxySubject() { if(realSubject == null) { realSubject = new RealSubject(); } } @Override public void doSomething() { System.out.println("befor do something"); realSubject.doSomething(); System.out.println("after do something"); } }
客户端访问:
package com.njupt.study.designmodle.proxy; public class Client { /** * @param args */ public static void main(String[] args) { Subject subject = new ProxySubject(); subject.doSomething(); } }
输出:
总结:
代理模式的功能 : 通过创建一个代理对象,用这个代理对象去代表真实的对象,客户端使用这个代理对象来操作真实的对象(当客户端操作这个代理对象的时候,实际上功能最终还是会由真实的对象来完成,只不过是通过代理操作的,也就是客户端操作代理,代理操作真正的对象)
下面以人去买车来作为实例讲解如下:
抽象的接口:
package com.njupt.study.designmodle.proxy; /** * 新建一个买车的接口 * @author Pony * */ public interface Buy_Car { public void buy_mycar(); }
真实对象:
package com.njupt.study.designmodle.proxy; public class People implements Buy_Car { private int cash; private String vip; private String username; @Override public void buy_mycar() { System.out.print(username+"是vip 客户,可以直接购买新车!"); } public int getCash() { return cash; } public void setCash(int cash) { this.cash = cash; } public String getVip() { return vip; } public void setVip(String vip) { this.vip = vip; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } }
代理对象;
package com.njupt.study.designmodle.proxy; /** * people类不能拥有车,必须经过proxy代理类的认证,符合条件之后才可以拥有车辆,新建一个代理,这个代理类来考察当前的people是否有资格进行买车: * @author Pony * */ public class ProxyClass implements Buy_Car { private People people; public People getPeople() { return people; } public void setPeople(People people) { this.people = people; } @Override public void buy_mycar() { if (people.getVip() == "vip") { people.buy_mycar(); return; } if (people.getCash() >= 50000) { System.out.println(people.getUsername() + "买了新车,交易结束!"); } else { System.out.println(people.getUsername() + "钱不够,不能买车,继续比赛!"); } } }
客户端:
package com.njupt.study.designmodle.proxy; public class RunClient { /** * @param args */ public static void main(String[] args) { People people_1 =new People(); people_1.setCash(60000); people_1.setUsername("jeck"); People people_2 =new People(); people_2.setCash(40000); people_2.setUsername("rose"); People people_3 =new People(); people_3.setCash(0); people_3.setUsername("tom"); people_3.setVip("vip"); ProxyClass proxy_buy = new ProxyClass(); proxy_buy.setPeople(people_1); proxy_buy.buy_mycar(); proxy_buy.setPeople(people_2); proxy_buy.buy_mycar(); proxy_buy.setPeople(people_3); proxy_buy.buy_mycar(); } }
运行结果如下: