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

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

代理模式:

核心作用:通过代理控制对对象的访问,可以详细访问某个对象的方法,在调用这个方法前置处理,调用这个方法后做后置处理。

抽象角色:定义角色代理和真实角色的公共对外方法。

真实角色:实现抽象角色,定义真实角色所需要的实现的业务逻辑,供代理角色调用。 关注真正的业务逻辑!

代理角色:实现抽象角色,是真实角色的代理,通过真实角色的代理的业务逻辑方法来实现抽象方法,并可以附加自己的操作。 将统一的流程控制放到代理角色中处理。

安全代理:屏蔽对真实角色的直接访问。

远程代理:通过代理类处理远程方法调用(RMI)

延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象。

分类: 静态代理 动态代理

应用:

JDK自带的动态代理

javaassist字节码操作

CGLIB(Code Generation Library)库的实现

ASM(汇编底层使用指令,可维护性较差)

静态代理的Demo:

 

package com.wxisme.staticproxy;/** * 静态代理 * @author Administrator * */public interface Star {    void confer();        void signContract();        void sellTicket();        void sing();        void collectMoney();    }class RealStar implements Star {    @Override    public void sellTicket() {        System.out.println("售票");    }    @Override    public void collectMoney() {        System.out.println("收钱");    }    @Override    public void confer() {        System.out.println("面谈");    }    @Override    public void signContract() {        System.out.println("签合同");    }    @Override    public void sing() {        System.out.println("明星唱歌");    }}class ProxyStar implements Star {    private Star star;    public ProxyStar(Star star) {        this.star = star;    }    @Override    public void sellTicket() {        System.out.println("售票");    }    @Override    public void collectMoney() {        System.out.println("收钱");    }    @Override    public void confer() {        System.out.println("面谈");    }    @Override    public void signContract() {        System.out.println("签合同");    }    //调用真实角色的方法    @Override    public void sing() {        star.sing();    }    }package com.wxisme.staticproxy;public class Client {    public static void main(String[] args) {        Star realStar = new RealStar();        Star proxy = new ProxyStar(realStar);                proxy.confer();        proxy.signContract();        proxy.sellTicket();        proxy.sing();                proxy.collectMoney();    }}

运行结果:

面谈

签合同
售票
明星唱歌
收钱

把静态代理改成动态代理:

可以参考一下大神对Java动态代理的解释:

                                                          

 

package com.wxisme.dynamicproxy;public interface Star {    void confer();        void signContract();        void sellTicket();        void sing();        void collectMoney();    }class RealStar implements Star {    @Override    public void sellTicket() {        System.out.println("售票");    }    @Override    public void collectMoney() {        System.out.println("收钱");    }    @Override    public void confer() {        System.out.println("面谈");    }    @Override    public void signContract() {        System.out.println("签合同");    }    @Override    public void sing() {        System.out.println("明星唱歌");    }}import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class StarHandler implements InvocationHandler {    private Star realStar;            public StarHandler(Star realStar) {        super();        this.realStar = realStar;    }    @Override    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        Object obj = null;                        //可以进行一系列的流程控制。                System.out.println("售票");        System.out.println("面谈");        System.out.println("签合同");                if(method.getName().equals("sing")) {            obj = method.invoke(realStar, args);        }        System.out.println("收钱");                return obj;    }}package com.wxisme.dynamicproxy;import java.lang.reflect.Proxy;public class Client {    public static void main(String[] args) {        Star realStar = new RealStar();        StarHandler handler = new StarHandler(realStar);        Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),                 new Class[]{Star.class}, handler);                        proxy.sing();            }}

运行结果:

售票

面谈
签合同
明星唱歌
收钱

 

转载地址:http://riktx.baihongyu.com/

你可能感兴趣的文章
二维码纠错率的问题
查看>>
我的友情链接
查看>>
Lync 2010迁移Lync 2013部署后前端服务无法启动处理案例
查看>>
RSA收购SilverTail System,布局网络欺诈检测和CyberSecurity
查看>>
原 ASP.NET如何使用JSON
查看>>
监控本地主机的msyql服务
查看>>
js对时间所有的操作类和代码
查看>>
android之android.intent.category.DEFAULT的用途和使用
查看>>
zabbix2.2入门教程之监控lvs(三)
查看>>
新手学做网站的建议教程
查看>>
北京故事(12)
查看>>
Zend Studio上安装使用Aptana插件(html,css,js代码提示功能)
查看>>
pdm中批量添加字段
查看>>
vcenter5.1安装的一些体会
查看>>
深入分析Java ClassLoader原理
查看>>
前端资源(50)
查看>>
谈谈64 位程序的内嵌汇编
查看>>
python引用另一个文件夹里的python函数
查看>>
springboot手动提交kafka offset
查看>>
我的友情链接
查看>>