设计模式-12 代理模式

来源:互联网 发布:淘宝助理怎么使用5.5 编辑:程序博客网 时间:2024/05/17 05:17

1 静态代理

主题接口

public interface Subject {    void request();}

真正的主题对象

public class RealSubject implements Subject{    public void request() {        System.out.println("request() 真正的角色");    }}

代理对象

public class ProxyObject implements Subject {    /**     * 真实对象     */    private Subject subject;    public ProxyObject(Subject subject){        this.subject = subject;    }    public void request() {        System.out.println("ProxyObject begin");        subject.request();        System.out.println("ProxyObject finish");    }}

Client

public class Test {    public static void main(String[] args) {        Subject subject = new RealSubject();        ProxyObject proxy = new ProxyObject(subject);        proxy.request();    }}

打印结果

ProxyObject beginrequest() 真正的角色ProxyObject finish

代理对象中持有一个主题接口的对象。当调用代理对象的request()方法时将会使用主题对象调用主题对象的方法。

2 动态代理

主题

public interface Subject {    void request();}

主题实现类

public class RealSubject implements Subject{    public void request() {        System.out.println("request() 真正的角色");    }}

代理者

public class MyIncationHandler implements InvocationHandler{    private Object mTarget;    public MyIncationHandler(Object object){        this.mTarget = object;    }    public Object invoke(Object proxy, Method method, Object[] args)            throws Throwable {        System.out.println("MyIncationHandler before");        Object result = method.invoke(mTarget, args);        System.out.println("MyIncationHandler finish");        return result;    }}
public class Test {    public static void main(String[] args) {        Subject subject = new RealSubject();                /**         * 第一个参数 classLoader contextLoader         * 第二个参数 接口参数 决定返回的对象实现了哪些接口         * 第三个参数 myIncationHandler 代理时 需要处理具体的接口         */        MyIncationHandler myIncationHandler = new MyIncationHandler(subject);        Subject proxy = (Subject) Proxy.newProxyInstance(                Thread.currentThread().getContextClassLoader(),                subject.getClass().getInterfaces(),                myIncationHandler);        proxy.request();    }}

运行结果

MyIncationHandler beforerequest() 真正的角色MyIncationHandler finish

使用代理调用接口里的方法

proxy.request();

最终会回调到实现类的方法,从打印结果可以得出该结论。
并且代理对象中invoke()方法的这一行表示用实现类去反射射调用实现类的方法。

Object result = method.invoke(mTarget, args);

使用动态代理的几个步骤:

1 创建接口,并创建该接口的实现类。
2 创建代理对象实现并实现InvocationHandler接口。在抽象方法中反射调用方法。
3 初始化代理对象

Subject proxy = (Subject) Proxy.newProxyInstance(                Thread.currentThread().getContextClassLoader(),                subject.getClass().getInterfaces(),                myIncationHandler);

4 用代理对象去调用接口的方法。

proxy.request();
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 和隔壁邻居吵架了怎么办 教师上课期间孩子出问题责任怎么办 孩子一考试妈妈就焦虑怎么办 妈妈爱发脾气孩子也发脾气怎么办 孩子对家人有抵触情绪怎么办 孩子因为没耐心哭闹怎么办 宝宝哭闹真是没耐心怎么办 对自己孩子没耐心怎么办 跳了把腰伤了怎么办 爸爸对妈妈家暴怎么办 逆反心强23岁怎么办 觉得自己心理有问题怎么办 小孩心理脆弱过于敏感怎么办? 父母老是骂打我怎么办 爸妈打架闹离婚怎么办 夫妻离婚后孩子户口怎么办 离婚后孩子户口怎么办落户 50岁父母要离婚怎么办 父母离婚小孩没有出生证该怎么办 离婚。父母一直在劝说该怎么办 老婆跟人跑了怎么办啊 父母50了要离婚怎么办 父母吵架了我该怎么办 父母看孩子总是吵架怎么办 20岁父母离婚我怎么办 碰到没素质的人怎么办 父母抛弃了我该怎么办 父母说家里没钱困难怎么办 遇到素质低的老婆怎么办 孩子考试心里素质差怎么办 5岁儿童脾气不好怎么办 有一个素质差的父母怎么办 孩子对什么都无所谓怎么办 孩子在学习上无所谓怎么办 孩子对学习无所谓的态度怎么办 孩子不上进什么都无所谓怎么办 倔强的学生不理老师怎么办 一岁宝宝特别犟怎么办 孩子遇到问题喜欢发脾气怎么办 企业培养新人跑了怎么办 二年级学生读不懂题目怎么办