博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式--代理模式
阅读量:6224 次
发布时间:2019-06-21

本文共 2979 字,大约阅读时间需要 9 分钟。

代理模式由三部分组成:委托类,代理类,抽象类。

委托类、代理类都实现了抽象类。

静态代理:点到点

 

//抽象角色public interface ProxyTestDao {    void add();    }

 

首先,(ProxyTestDaoImpl  实现抽象类)

public class ProxyTestDaoImpl implements ProxyTestDao{    public void add() {        System.out.println("ProxyTestDaoImpl.add();");    }}

(ProxyTestDaoProxyImpl 实现抽象类)

public class ProxyTestDaoProxyImpl implements ProxyTestDao{    //真实角色    private ProxyTestDao proxyTestDao;    //代理角色的构造器    public ProxyTestDaoProxyImpl(ProxyTestDao proxyTestDao) {        this.proxyTestDao = proxyTestDao;    }    //代理角色的方法,可以附加自己的操作    public void add() {        System.out.println("前置代理");        proxyTestDao.add();        System.out.println("后置代理");    }

这样准备工作已完成,只需要委托类委托代理类实现具体方法。

 

1 public class ProxyTestAction { 2  3     public static void main(String[] args) { 4         //委托类( 5         ProxyTestDaoImpl ptd = new ProxyTestDaoImpl(); 6         //代理类 7         ProxyTestDaoProxyImpl ptdp = new ProxyTestDaoProxyImpl(ptd); 8         //代理类的方法(附加了自己的操作) 9         ptdp.add();10     }11 12 }

动态代理:面到面

JDK Proxy:需要实现java.lang包下的InvocationHandler类

public class LogHandler implements InvocationHandler{        private Object obj;        public LogHandler(Object obj) {        this.obj = obj;    }    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                System.out.println("执行前...");        method.invoke(obj, args);        System.out.println("执行后...");                return null;    }    }

通过实现java.lang.reflect.InvocationHandler,InvocationHandler类中的invoke方法,第一个参数proxy代表的是代理类、第二个参数method为当前执行的方法,第三个参数为接口数组。

public class ProxyTestAction {    public static void main(String[] args) {        //委托类(真实角色)        ProxyTestDao ptd = (ProxyTestDao) Proxy.newProxyInstance(                    ProxyTestDao.class.getClassLoader(),                    ProxyTestDaoImpl.class.getInterfaces(),                    new  LogHandler(new ProxyTestDaoImpl()));        ptd.add();            }}

Cglib : 实现MethodInterceptor类

package api.cloudp.cc.cloudpserver.web.interceptor;public class ProxyTestDao {    void add(){        System.out.println("ProxyTestDao.add();");    };    }

 

public class LogHandler  implements MethodInterceptor {        public Object intercept(Object arg0, Method method, Object[] arg2,            MethodProxy methodProxy) throws Throwable {        System.out.println("日志记录");        return methodProxy.invokeSuper(arg0, arg2);    }}
public class ProxyTestAction {public  static  ProxyTestDao  getDao(){                Enhancer  enhancer=new Enhancer();            enhancer.setSuperclass(ProxyTestDao.class);   // 不需要new 委托类。              enhancer.setCallback(new LogHandler());   // 代理类的执行内容            return (ProxyTestDao) enhancer.create();  // 返回一个代理对象。    }    public static void main(String[] args) {        //委托类(真实角色)        ProxyTestDao ptd = ProxyTestAction.getDao();        System.out.println(ptd.getClass().getName());        ptd.add();    }}

 

转载于:https://www.cnblogs.com/tianhb/p/5956776.html

你可能感兴趣的文章
SQL语句集锦
查看>>
和安全有关的那些事(非对称加密、数字摘要、数字签名、数字证书、SSL、HTTPS及其他)...
查看>>
.NET单元测试的艺术-2.核心技术
查看>>
[.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现...
查看>>
Android Error: Unable to open class file R.java
查看>>
黄聪:如何WP中获取文章分类名称、分类ID、归档分类链接
查看>>
创业必读网站和工具集合
查看>>
Virtualbox安装增强工具失败
查看>>
HTTP协议状态码详解(HTTP Status Code)
查看>>
Storm集群安装部署步骤【详细版】
查看>>
【转】java将excel文件转换成txt格式文件
查看>>
(筆記) 如何停用Windows XP的USB autorun? (OS) (Windows)
查看>>
Programming in the Mid-Future(转)
查看>>
Spring任务调度实战之Quartz Cron Trigger
查看>>
java 监控 收集资料3(收集中)
查看>>
从excel看数据分析1
查看>>
将String保存成文件
查看>>
12款JavaScript表单插件
查看>>
HDOJ 1090
查看>>
ajax交互的两种方式:html与xml
查看>>