设计模式系列之六:代理模式

来源:互联网 发布:linux远程拷贝文件夹 编辑:程序博客网 时间:2024/05/18 01:05

代理模式是一种很常用的结构型模式,类似于生活中的代理机构,比如机票代购点,海外代购等等,演员的经纪人就是所谓的代理人也是这种形式。

代理模式分为静态代理和动态代理

静态代理有三个核心角色,抽象角色(定义真实角色和代理角色对外的公开方法),真实角色(实现抽象角色的方法以供道理角色调用,关注真正的业务逻辑),代理角色(实现抽象角色,是真实角色的代理,通过真实角色的方式实现抽象角色的方法并可以添加自己的操作,统一处理流程控制)

package com.panda.staticProxy;public interface Actor {void faceTalk();void signContract();void perform();void collectMoney();}

package com.panda.staticProxy;public class RealActor implements Actor{@Overridepublic void faceTalk() {// TODO Auto-generated method stubSystem.out.println("演员老王面谈");}@Overridepublic void signContract() {// TODO Auto-generated method stubSystem.out.println("演员老王签协议");}@Overridepublic void perform() {// TODO Auto-generated method stubSystem.out.println("演员老王演出");}@Overridepublic void collectMoney() {// TODO Auto-generated method stubSystem.out.println("演员老王收尾款");}}

package com.panda.staticProxy;public class Proxy implements Actor{private Actor realActor;public Proxy(Actor realActor) {super();this.realActor = realActor;}@Overridepublic void faceTalk() {// TODO Auto-generated method stubSystem.out.println("代理人老宋面谈");}@Overridepublic void signContract() {// TODO Auto-generated method stubSystem.out.println("代理人老宋签协议");}@Overridepublic void perform() {realActor.perform();}@Overridepublic void collectMoney() {// TODO Auto-generated method stubSystem.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;}@Overridepublic 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();}}

处理结果:






0 0
原创粉丝点击