设计模式系列之六:代理模式
来源:互联网 发布: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
- 设计模式系列之六:代理模式
- 设计模式系列(六)代理模式
- 设计模式之(六)代理模式Proxy
- 设计模式之六:代理模式
- 设计模式之六:代理模式
- JAVA设计模式之六代理模式
- 设计模式系列之代理
- 设计模式系列之六:策略模式
- 设计模式系列之六命令模式
- 设计模式系列之五:代理模式
- 设计模式系列之十三代理模式
- 设计模式(六)---代理模式
- 【设计模式】【六】代理模式
- 设计模式(六)之 Proxy(代理)
- 六 设计模式之代理模式(或称委托模式)
- 设计模式系列:代理模式
- 代理模式——结构型设计模式之六
- 浅析JAVA设计模式之代理模式(六)
- Centos7中java环境变量的配置
- Oracle汉字转化英文
- Android控件分类整理
- Java语言有哪些优点?
- pgsql在linux导入导出数据
- 设计模式系列之六:代理模式
- HTTP 缓存机制
- codeforces Gym 100500Problem H. ICPC Quest 简单DP
- Linux操作基础篇
- intellj idea 如何设置类头注释和方法注释
- C++学习一对象数组的初始化
- 虚拟存储器
- 华为机试 计负均正
- C语言典型代码---Curl实现POST