代理模式

来源:互联网 发布:编程求解汉诺塔问题 编辑:程序博客网 时间:2024/06/05 03:40
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
代理模式:
  人如其名,代理相信大家都可以经常看到什么什么代理,现实中代理太多了。感受最真实的是火车票的代理,经常可以在街上看到,你买票的是在代理商买的,但是付的钱依然会交给铁大哥,这就是代理。现实中的你可能会接触的例子就是叫同学去给你买票,实际上不是你去买,但是是票是你的。这也是代理。
代理模式组成:
  抽象角色:通过接口或抽象类声明真实角色实现的业务方法。
  代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。
  真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用。
代理的UML图
  
代理的优点:
  (1).职责清晰 真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。叫你去买票,我管你有没有摔跤撒的,不需要关注这种问题。
  (2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。别人在路上一看,以为是你同学要买票去哪里,实际上买的是你的,保护了你。
  (3).高扩展性 只要符合火车站规定的人,同学都可以去代人买票。
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class Proxy {    public static void main(String[] args) {        ProxyRole proxyRole=new ProxyRole(new XiaoA());        proxyRole.buyTicket();        PersonTest personTest=new XiaoA();        DynamicProxy dynamicProxy=new DynamicProxy(personTest);        PersonTest proxy= (PersonTest) dynamicProxy.getProxy();        proxy.buyTicket();    }}interface PersonTest{    void buyTicket();}class XiaoA implements PersonTest{    @Override    public void buyTicket() {        System.out.println("买票");    }}class ProxyRole implements PersonTest{    private PersonTest personTest;    //默认代理小A    public ProxyRole() {        this.personTest=new XiaoA();    }    //也可以代理其他子类    public ProxyRole(PersonTest personTest) {        this.personTest=personTest;    }    @Override    public void buyTicket() {        personTest.buyTicket();    }}//使用JDK的动态代理//实现自己的InvocationHandlerclass DynamicProxy implements InvocationHandler{    //目标对象    private Object object;    public DynamicProxy(Object object) {        this.object = object;    }    //执行目标对象的方法    @Override    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {        //before        Object result = method.invoke(object, args);        //after        return result;    }    public Object getProxy(){        return java.lang.reflect.Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),this.object.getClass().getInterfaces(),this);    }}

JDK动态代理原理请看:http://rejoy.iteye.com/blog/1627405

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 余飞沈雨霏 妙手神农余飞 佚怎么读音 恐怖视角 佚名教主 佚名是什么意思 佚名书法 佚名的个人资料 佚名诗歌 佚名电子书 作者佚名的作品集 作词佚名 佚名的拼音 佚名是谁的笔名 佚名歌曲大全 作家佚名本人的照片 神级鉴定系统 佚名教主 佛爷 佛系 佛说 求佛 误佛 学佛 佛纹 佛曲 佛网 佛骨 佛店 佛颂 藏佛 佛茶 佛典 说佛 见佛 问佛 多佛 泥白佛我对钱真没兴趣 佛前献花恐怖复苏 恐怖复苏佛前献花 佛系田园 佛系快穿 佛本是