设计模式系列之六:代理模式
2017-02-22 10:12
225 查看
代理模式是一种很常用的结构型模式,类似于生活中的代理机构,比如机票代购点,海外代购等等,演员的经纪人就是所谓的代理人也是这种形式。
代理模式分为静态代理和动态代理
静态代理有三个核心角色,抽象角色(定义真实角色和代理角色对外的公开方法),真实角色(实现抽象角色的方法以供道理角色调用,关注真正的业务逻辑),代理角色(实现抽象角色,是真实角色的代理,通过真实角色的方式实现抽象角色的方法并可以添加自己的操作,统一处理流程控制)
结果:
动态代理:动态生成代理类。相比于静态代理,抽象角色中所有的方法都被调用到处理器一个集中方法中,这样我们可以更加统一和灵活的处理各种方法
调用时就不需要自定义一个代理类了
处理结果:
代理模式分为静态代理和动态代理
静态代理有三个核心角色,抽象角色(定义真实角色和代理角色对外的公开方法),真实角色(实现抽象角色的方法以供道理角色调用,关注真正的业务逻辑),代理角色(实现抽象角色,是真实角色的代理,通过真实角色的方式实现抽象角色的方法并可以添加自己的操作,统一处理流程控制)
package com.panda.staticProxy; public interface Actor { void faceTalk(); void signContract(); void perform(); void collectMoney(); }
package com.panda.staticProxy; public class RealActor implements Actor{ @Override public void faceTalk() { // TODO Auto-generated method stub System.out.println("演员老王面谈"); } @Override public void signContract() { // TODO Auto-generated method stub System.out.println("演员老王签协议"); } @Override public void perform() { // TODO Auto-generated method stub System.out.println("演员老王演出"); } @Override public void collectMoney() { // TODO Auto-generated method stub System.out.println("演员老王收尾款"); } }
package com.panda.staticProxy; public class Proxy implements Actor{ private Actor realActor; public Proxy(Actor realActor) { super(); this.realActor = realActor; } @Override public void faceTalk() { // TODO Auto-generated method stub System.out.println("代理人老宋面谈"); } @Override public void signContract() { // TODO Auto-generated method stub System.out.println("代理人老宋签协议"); } @Override public void perform() { realActor.perform(); } @Override public void collectMoney() { // TODO Auto-generated method stub System.out.println("代理人老宋收尾款"); } }现在客户只需与代理人老宋接触,并洽谈有关事宜,老王只关注演戏
package com.panda.staticProxy; public class Client { public static void main(String[] args) { Actor actor = new RealActor(); Proxy proxy = new Proxy(actor); proxy.faceTalk(); proxy.signContract(); proxy.perform(); proxy.collectMoney(); } }
结果:
动态代理:动态生成代理类。相比于静态代理,抽象角色中所有的方法都被调用到处理器一个集中方法中,这样我们可以更加统一和灵活的处理各种方法
package com.panda.dynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class StarHandler implements InvocationHandler{ Actor actor; public StarHandler(Actor actor) { super(); this.actor = actor; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("###在执行前###"); System.out.println("由老宋进行面谈"); System.out.println("由老宋进行签合同"); if(method.getName().equals("perform")){ method.invoke(actor, args); } System.out.println("###在执行后###"); System.out.println("由老宋进行收尾款"); return null; } }
调用时就不需要自定义一个代理类了
package com.panda.dynamicProxy; import java.lang.reflect.Proxy; public class Client { public static void main(String[] args) { Actor actor = new RealActor(); StarHandler handler = new StarHandler(actor); Actor proxy = (Actor) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Actor.class}, handler); proxy.perform(); } }
处理结果:
相关文章推荐
- C#设计模式系列:代理模式(Proxy Pattren)
- 设计模式学习系列--代理模式
- Java设计模式系列之动态代理模式(转载)
- 研磨设计模式 之 代理模式(Proxy)1——跟着cc学设计系列
- 设计模式系列-代理模式
- 设计模式总结篇系列:代理模式(Proxy)
- 设计模式系列---代理模式
- 深入理解JavaScript系列(31):设计模式之代理模式详解
- JavaScript 设计模式系列 : 代理模式
- 通俗系列-Java设计模式-代理模式
- JAVA系列-设计模式-代理模式
- 深入理解JavaScript系列(31):设计模式之代理模式
- C# 设计模式系列教程-代理模式
- java设计模式系列-代理模式
- 4.偏头痛杨的常见设计模式入门系列之代理模式篇
- 深入理解JavaScript系列(31):设计模式之代理模式
- C#设计模式系列:代理模式(Proxy)
- 设计模式系列-代理模式
- Java/Android 设计模式系列(9)--代理模式
- 深入理解JavaScript系列(31):设计模式之代理模式