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

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

代理模式指某些情况下,一个客户不想或者不能直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

通过代理,控制对对象的访问。

代理模式核心角色:

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

  真实角色:真正的业务实现

  代理角色: 实现抽象角色,通过对真实角色的业务实现方法来实现抽象方法。也可以新增自己的操作(比如:AOP)

分类:

  静态代理: 静态代理对象调用的真实对象由自己创建

/** * 定义一个抽象角色 */public interface Star {    /**     * 会谈     */    void confer();    /**     * 唱歌     */    void sing();    void sing(int a);}

  

/** * 真实角色 */public class ReadStar implements Star {    @Override    public void confer() {        System.out.println("confer");    }    @Override    public void sing() {        System.out.println("sign");    }    @Override    public void sing(int a) {        System.out.println("sign:"+ a);    }}

  

/** * 静态代理,真实对象由调用者提供 */public class StaticProxy implements Star {    private ReadStar readStar;    public StaticProxy(ReadStar readStar) {        this.readStar = readStar;    }    @Override    public void confer() {        readStar.confer();    }    @Override    public void sing() {        readStar.sing();    }    @Override    public void sing(int a) {        readStar.sing(a);    }}
public class Main {    public static void main(String[] args) {        ReadStar star = new ReadStar();        Star proxy = new StaticProxy(star);        proxy.confer();        proxy.sing();    }}

  动态代理:动态代理中,代理类由工具动态生成。常见由jdk动态代理,c'g'lib字节码等。

  JDK动态代理:

    --java.lang.reflect.Proxy:动态生成代理类和对象

    --java.lang.reflect.InvocationHandler(处理器接口):通过invoke方法实现对真实角色的代理访问。

  

public class StarHandler implements InvocationHandler {    Star realStar;    public StarHandler(Star realStar) {        super();        this.realStar = realStar;    }    /**     * 调用方法时     * @param proxy     * @param method     * @param args     * @return     * @throws Throwable     */    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        System.out.println("jdk proxy...."+ args);        method.invoke(realStar, args);        return null;    }}

  

public class Main {    public static void main(String[] args) {        Star star = new ReadStar();        StarHandler handler = new StarHandler(star);        Star proxy = (Star) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(),                new Class[]{Star.class}, handler);        proxy.sing(1);    }}

  基于JDK动态代理之能对接口创建代理实例。如果需要对类创建代理,可以采用Cglib字节码方式。

    

  

 

转载于:https://www.cnblogs.com/gcm688/p/10171056.html

你可能感兴趣的文章
server2016下搭建web服务器&三种虚拟主机实验文档
查看>>
快速安装mongodb
查看>>
堆和栈 各种变量存储位置
查看>>
代码管理平台
查看>>
linux操作系统基础
查看>>
[转]linux下tcp选项TCP_DEFER_ACCEPT详解
查看>>
第五周学习总结
查看>>
Oracle高级查询之LAG和LEAD分析函数
查看>>
golang学习的点点滴滴:接口组合
查看>>
【挨踢人物传】frankfan:和自己赛跑的人——不要怕、不后悔!(第九期)
查看>>
anjularjs 第一天
查看>>
HSRP (不同VLAN之间的热备份路由协议)
查看>>
大数据平台一键安装OS【定制化OS镜像制作】
查看>>
git跟踪指定几个文件夹
查看>>
centos服务器到网关丢包(nf_conntrack:table full)
查看>>
Keepalive 之 高可用实现
查看>>
Ansible 之 概念和常用模块介绍
查看>>
电信2月国内市场份额52.22% 环比上月下降0.61%
查看>>
6月21日全球域名注册商(国际域名)保有量及市场份额
查看>>
批量设置0777
查看>>