四、代理模式

1 代理模式?

  为其他对象提供一种代理,用以完成对这个对象的控制访问。

  记忆方法:

     /**
       * 记忆方法:抽象出一个接口,代理类和真实的操作对象都实现接口
       *                代理类中通过构造方法注入真实要操作的对象
       *              代理中在调用真实对象的方法之前,完成验证。
      */

2 代理模式的应用场景?
  应用一:远程访问!本地通过代理完成对远端的访问。那么为什么本地不直接去访问远端,非要经过一个代理呢?一种情况是你需要调用的对象在另外一台机器上,你需要跨越网络才能访问,如果让你直接coding去调用,你需要处理网络连接、处理打包、解包等等非常复杂的步骤,所以为了简化客户端的处理,我们使用代理模式,在客户端建立一个远程对象的代理,客户端就象调用本地对象一样调用该代理,再由代理去跟实际对象联系,对于客户端来说可能根本没有感觉到调用的东西在网络另外一端,这实际上就是Web Service的工作原理。

  应用二:虚拟代理,就是耗时操作交给代理完成。达到性能的优化。了比如说你打开一个很大的HTML网页时,里面很多的文字和图片,如果一次性把所有的图片和文字加载完毕以后才显示,可能需要等很长时间,这样的体验很差。如果先把文字一次性呈现出来,然后图片的加载交给代理慢慢的加载出来,这样的体验较好。

  应用三:安全代理,就是在访问真实的目标对象前,在代理中实现拦截(安全验证等)。

  应用四:增加额外的功能。除了当前类能够提供的功能外,我们还需要补充一些其他功能。最容易想到的情况就是权限过滤,我有一个类做某项业务,但是由于安全原因只有某些用户才可以调用这个类,此时我们就可以做一个该类的代理类,要求所有请求必须通过该代理类,由该代理类做权限判断,如果安全则调用实际类的业务开始处理。可能有人说为什么我要多加个代理类?我只需要在原来类的方法里面加上权限过滤不就完了吗?在程序设计中有一个类的单一性原则问题,这个原则很简单,就是每个类的功能尽可能单一。为什么要单一,因为只有功能单一这个类被改动的可能性才会最小,就拿刚才的例子来说,如果你将权限判断放在当前类里面,当前这个类就既要负责自己本身业务逻辑、又要负责权限判断,那么就有两个导致该类变化的原因,现在如果权限规则一旦变化,这个类就必需得改,显然这不是一个好的设计。

3 代理模式的优点?

  如上应用四所说,可以实现单一职责原则。业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。

4 静态代理的实现demo:(包含安全验证)

  静态代理的缺点:

    1)如下demo中,只代理了真实对象的一个方法,request,如果要代理的方法很多,那就需要很多的代理,这样开销大。 
    2)如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。

package com.biao.proxy.second;

public class ProxyDemo {
    public static void main(String[] args) {
        Subject target=new RealSubject();
        Subject proxy=new StaticProxy(target);
//        proxy.request("abc");  //测试1,被拦截,不通过
        proxy.request("hello");  //测试2,验证通过。
    }
}

//抽象角色
interface Subject {
  public void request(String param);
}

/*目标角色*/
class RealSubject implements Subject{
  @Override
  public void request(String param) {
      System.out.println("真实请求成功");
  }
}
/*静态代理,通过构造方法注入一个真实的需要被代理的对象*/
class StaticProxy implements Subject{
    Subject  realSubject;
    public StaticProxy(Subject  realSubject) {
        this.realSubject=realSubject;
    }
    public void before(String param){
        if(param.equals("abc"))//验证参数
            throw new IllegalArgumentException();
    }
    @Override
    public void request(String param) {
        before(param);//请求之前先进行验证,用代理实现验证。
        realSubject.request(param);
    }
}

5 动态代理解决静态代理的缺点?

  动态代理类的对象是在程序运行期间由JVM根据反射等机制动态的生成,也就是不用一次创建那么多的代理对象,当需要代理的时候(程序运行),才去创建对象,这样开销小。

动态代理的实现demo如下;

package com.biao.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class DynamicProxyDemo {
    public static void main(String[] args) {
        Subject target=new RealSubject();
        //第一个参数是目标对象的类加载器,第二个参数是目标类实现的接口,第三个参数是处理器InvocationHandler
        Subject proxy=(Subject)Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new ProxyHandler(target));
//        proxy.request("abc");   //测试1
        proxy.request("hello"); //测试2
    }
}

/*抽象角色*/
interface Subject {
    public void request(String param);
}

/*目标角色*/
class RealSubject implements Subject{
    @Override
    public void request(String param) {
        System.out.println("真实请求成功");
    }
}
/**
 * public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
 * 第一个参数是代理对象,第二个参数是目标方法,第三个参数是目标方法参数
 */
class ProxyHandler implements InvocationHandler{
    Object target;
    public ProxyHandler(Object target) {
        this.target=target;
    }
    public void before(String param) throws Throwable{
        if(param.equals("abc"))
            throw new IllegalArgumentException();
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        before((String)args[0]);
        return method.invoke(target, args);
    }
}

参考:http://www.cnblogs.com/silverLee/archive/2010/02/05/1664577.html

http://www.jianshu.com/p/c3add1ef26e2

http://layznet.iteye.com/blog/1182924

时间: 2024-11-06 12:23:21

四、代理模式的相关文章

Java设计模式菜鸟系列(十四)代理模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39856435 代理模式(Composite):代理模式其实就是多一个代理类出来,替原对象进行一些操作.比如咱有的时候打官司需要请律师,因为律师在法律方面有专长,可以替咱进行操作表达咱的想法,这就是代理的意思.代理模式分为两类:1.静态代理(不使用jdk里面的方法):2.动态代理(使用jdk里面的InvocationHandler和Proxy).下面请看示例: 一.静态代理 1.uml建模

设计模式<四>——代理模式

番外:仅供个人学习 类图: 客户想要操作RealSubject,但实际上是操作Proxy,然后让Proxy去代理客户操作RealSubject.继承统一接口的好处是使得代理类(Proxy)和被代理类(RealSubject)对外都暴露统一的接口.实际上,视情况而定,不一定非得继承至统一接口. 与适配器模式的区别:适配器模式着重于数据的转化适配,而代理模式着重于操作的转移

设计模式(十四):代理模式

一.概述 代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问.其实就是代理就是做到类似转发的功能,针对不同代理,转发的具体实现不同. 二.解决问题 从原理知道他就是控制客户对一个对象的访问,它跟现实中的中介代理类似,只是作为代表做一些受理工作,真正执行的并不是它自己.比如买火车票,外面有很多火车票代理点,我们直接去代理点买票就好而不用跑到火车票买了(暂时不考虑网购哈). 三.结构类图 四.应用实例 在这个例子中,主要讲解远程代理,它可以作为另一个JVM上的本地代表.客户端调用代理的方

大话锦集(四)代理模式-Proxy

概念 代理模式为其它对象提供一种代理以控制对这个对象访问. 结构图 Subject类,定义了RealSubject和Proxy的公共接口,这样就在任何使用RealSubject的地方都可以使用Proxy. class Subject{ public: virtual void request() = 0; }; RealSubject类,定义Proxy所代表的真实实体 class RealSubject : public Subject{ public: void request() { cou

【非凡程序员】 OC第十四节课 (代理模式)

1.代理模式 举个例子:有一个婴儿,他本身不会自己吃饭和洗澡等等一些事情,于是婴儿就请了一个保姆,于是婴儿和保姆之间商定了一个协议,协议中写明了保姆需要做什么事情,而保姆就是这个代理人,  即:婴儿和保姆之间有个协议,保姆继承该协议,于是保姆就需要实现该协议中的条款成为代理人.2.代理模式的关键点: A完成一件事,但是自己不能完成,于是他找个代理人B 替他完成这个事情,他们之间便有个协议(protocol),B继承该协议来完成A代理给他的事情. 3.病人找医生看病 的案例: SickProtoc

设计模式C++实现四:代理模式

代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 应用场景:1.远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实. 2.虚拟代理,是根据需要创建开销很大的对象.通过它来存放实例化需要很长时间的真实对象.例如一个很大的HTML网页的打开,我们看到图片是一张一张下载后才能看到,而未打开的图片框,就是通过虚拟代理来替代真实的图片,此时代理存储了真实图片的路径和尺寸. 3.安全代理,用来控制真实对象访问时的权限. 4.智能引用,

C#设计模式之代理模式(四)

15.7 代理模式效果与适用场景 代理模式是常用的结构型设计模式之一,它为对象的间接访问提供了一个解决方案,可以对对象的访问进行控制.代理模式类型较多,其中远程代理.虚拟代理.保护代理等在软件开发中应用非常广泛. 15.7.1 模式优点 代理模式的共同优点如下: (1) 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度. (2) 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性. 此外,不同类型的代理模式也具有独特的优点,例

四(2)、复用类补充之关于代理模式的一点理解

一.关于代理模式的几个概念 1.比如A要去租房,通过中介B,租到C家的房子,这里B就是A的代理. 代理可以认为是之前介绍的组合和继承的折中模式,它有继承的部分也有组合的部分. 2.代理的结构 1)抽象主题角色: 声明了真实主题和代理主题的共同的接口. 2)代理主题角色:内部含有真实主题的引用, 从而可以再任何时候操作真实主体对象:提供了一个与真实主题相同的接口,以便可以替代真实主题. 3)真实主题角色:抽象主题的实现,是具体被代理的对象. 二.三种常见的代理模式 1.普通代理模式 1 packa

<四>读<<大话设计模式>>之代理模式

代理模式我想大家即便不熟悉也都听过吧,从字面意思上看就是替别人干活的,比方代理商.在项目的实际应用中也有非常多地方用到.比方spring通过代理模式生成对象等. 代理模式的书面定义:为其它对象提供一种代理以控制对这个对象的訪问. 在某些情况下,一个对象不适合或者不能直接引用还有一个对象,而代理对象能够在client和目标对象之间起到中介的作用. 在<<大话设计模式>>一书中以一个有男朋友的女孩让"小菜"帮忙修电脑的故事展开的,事实上说白了代理就是帮别人干活的,一