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

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

  代理模式-积木模式

  代理模式在实际开发中的确非常常见和常用,表面上代理模式是产生出一个代理类,作为访问实际实现类的代理,控制了外界对实际代理类的访问,在此基础上增加一些增强性的功能。实际上,还将实际实现作为一个粒度,将增强的部分功能分离解耦。

这里记录一下实现的一些代码:

静态代理:

public interface Subject {    void toilet();}public class RealSubject implements Subject{    public void toilet() {        System.out.println("toilet");    }}/** * 代理类控制了真实角色的访问权限 * 而从代理类自身增强的角度来看,可以说是控制了被代理功能的粒度细分的控制 */public class SubjectProxy implements Subject{    Subject subject =  new RealSubject();    public void toilet() {        System.out.println("take my phone");        subject.toilet();        System.out.println("smell bad");    }}

动态代理(java proxy):

public class ProxyHandler implements InvocationHandler {    private Object object;    public ProxyHandler() {    }    public ProxyHandler(Object object) {        this.object = object;    }    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("take my phone");        Object result = method.invoke(object,args);        System.out.println("smell bad");        return result;    }}public class TestProxy {    public static void main(String[] args) {        Subject subject = new RealSubject();        ProxyHandler proxyHandler = new ProxyHandler(subject);        Subject subjectProxy = (Subject)Proxy.newProxyInstance(subject.getClass().getClassLoader(),                subject.getClass().getInterfaces(),proxyHandler);        subjectProxy.toilet();    }}

动态代理(cglib):

public class CglibProxyInterceptor implements MethodInterceptor{    public Object intercept(Object o, Method method,                            Object[] args, MethodProxy methodProxy)            throws Throwable {        System.out.println("take my phone");        Object o1 = methodProxy.invokeSuper(o, args);        System.out.println("smell bad");        return o1;    }}public class CglibProxyTest {    public static void main(String[] args) {        CglibProxyInterceptor cglibProxyInterceptor = new CglibProxyInterceptor();        Enhancer enhancer = new Enhancer();        enhancer.setCallback(cglibProxyInterceptor);        enhancer.setSuperclass(RealSubject.class);        Subject subject = (Subject)enhancer.create();        subject.toilet();    }}

 

转载于:https://www.cnblogs.com/killbug/p/6438253.html

你可能感兴趣的文章
Mysql授权远程登录
查看>>
java4中创建内对象的方法
查看>>
使用Docker Swarm搭建分布式爬虫集群
查看>>
脚踏实地学C#3-装箱和拆箱
查看>>
Dubbo定义及其作用
查看>>
APP技术演化的路
查看>>
HDU 1556
查看>>
js获取浏览器屏幕高度、宽度等
查看>>
javascript原型链
查看>>
环信 iOS SDK讲解
查看>>
[随想感悟] 面试时,问哪些问题能试出一个 Android 应用开发者真正的水平?【转自知乎】...
查看>>
ZOJ1969-Hard to Believe, but True!
查看>>
金花菜
查看>>
从MSN Messenger的Hand Writing开始
查看>>
微信支付v3发布到iis时的证书问题
查看>>
[NOI2015]软件包管理器
查看>>
jquery根据name属性查找
查看>>
清空表数据 mysql让主键从1开始
查看>>
用函数分配空间
查看>>
七牛云上传与删除图片
查看>>