设计模式07_代理模式

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/51550035


1、定义

代理模式为另一个对象提供替身或占位符以控制对这个对象的访问。使用代理模式创建代表对象,让代表对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。(摘自Head First 中文版第460页)


2、说明

代理模式中,代理类(proxy class)对它的客户隐藏了对象的具体信息。因此,在使用代理模式时,常常会在代理类中创建对象的实例;其主要在不改变接口的前提下,来“控制”对象的访问,“控制”占主导地位。相比于装饰者模式,装饰者模式将目标对象传入装饰类中,其主要是“扩展”功能。

大多数情况下,代理类和被代理对象是has-a关系(组合),除非代理类直接继承被代理类形成is-a关系(继承)。常用代理分为静态代理和动态代理。静态代理在随着时间的推移会出现问题,主要表现在如果类方法数量越来越多的时候,代理类的代码量是十分庞大的。其实在程序运行前就已经存在代理类的字节码文件,代理类和被代理类的关系在运行前就已经确定了。

动态代理则不会出现上面所述的问题。在动态代理中,动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和被代理类的关系是在程序运行时确定。 Spring AOP可以算作是代理模式的一个典型应用,通过参数即可判断真实类,而无需事先实例化,这样可以实现解耦和代码灵活多变。


3、角色

抽象角色:声明共同接口。这样,在任何可以使用目标对象的地方都可以使用代理对象。

代理角色:代理对象包含对目标对象的引用,在任何时候可操作目标对象;代理对象提供一个与目标对象相同的接口,以便可以在任何时候替代目标对象。

真实角色:代理对象所代表的目标对象,代理角色所代表的真实对象,其是最终要引用的对象。


4、类图


5、示例

静态代理代码示例如下所示:

package headfirst.design.proxy;

public interface Itraget {

    public void say();

}
package headfirst.design.proxy;

public class TargetObject implements Itraget {

    @Override
    public void say() {
        System.err.println("I want to say something");
    }

}
package headfirst.design.proxy;

public class PorxyObject implements Itraget{
    private Itraget target;

    PorxyObject() {
        this.target = new TargetObject();
    }

    @Override
    public void say() {
        this.target.say();
    }

}
package headfirst.design.proxy;

public class Test {
    public static void main(String[] args) {
        Itraget pItraget = new PorxyObject();
        pItraget.say();
    }
}


动态代理代码示例如下所示:

package headfirst.design.JDKproxy;

public interface ITarget {

    public void update();

}
package headfirst.design.JDKproxy;

public class ConcreateTarget implements ITarget {

    @Override
    public void update() {
        System.err.println("I am jdk proxy");

    }

}
package headfirst.design.JDKproxy;

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

public class PorxyHandle implements InvocationHandler {
    private Object target;

    public Object bind(Object obj) {
        target = obj;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {

        Object obj = null;

        obj = method.invoke(target, args);

        return obj;
    }

}
package headfirst.design.JDKproxy;

public class Test {

    public static void main(String[] args) {

        PorxyHandle handle = new PorxyHandle();

        ITarget tItraget = (ITarget) handle.bind(new ConcreateTarget());

        tItraget.update();

    }
}

6、总结

Java RMI(远程接口调用)中的stub对象就是代理对象,客户必须取得了stub对象才能给你调用其中的方法(具体情况不在此讲解感兴趣可以看看源码)。java.lang.reflect.Proxy也使用了代理模式,可以去看看源码学习学习。

动态代理的优点:动态代理类比较简洁,避免了创建多个不同静态代理的麻烦和重复多余的代码。调用目标代码时,在方法“运行时”动态的加入,更加灵活。

动态代理的缺点:系统变得灵活了,但是效率有所降低,其比静态代理慢一点。代码的可读性不好,不太容易理解。只能对实现了接口的类进行代理。

本文只是简单介绍了代理模式,并未对其进行深入探讨,略显粗糙。希望本文对你有所帮助。


时间: 2025-01-17 12:57:02

设计模式07_代理模式的相关文章

学习大话设计模式07_代理模式

代理模式:为其他对象提供一种代理以控制对这个对象的访问. 1 /** 2 * 定义了RealSubject和Proxy的共用接口,这样就在任何使用RealSubject的地方都可以使用Proxy. 3 * @author Monica 4 * 5 */ 6 abstract class Subject { 7 public abstract void Request(); 8 } 9 10 11 /** 12 * 定义Proxy所代表的真实实体 13 * @author Administrato

Android设计模式之代理模式 Proxy

一.概述 代理模式也是平时比较常用的设计模式之一,代理模式其实就是提供了一个新的对象,实现了对真实对象的操作,或成为真实对象的替身.在日常生活中也是很常见的.例如A要租房,为了省麻烦A会去找中介,中介会替代A去筛选房子,A坐享中介筛选的结果,并且交房租也是交给中介,这就是一个典型的日常生活中代理模式的应用.平时打开网页,最先开到的一般都是文字,而图片等一些大的资源都会延迟加载,这里也是使用了代理模式. 代理模式的组成: Abstract Subject:抽象主题-声明真实主题和代理主题共同的接口

【设计模式】代理模式

代理模式在所需对象和用户代码之间增加了一层对象,这个对象被称为代理.用户代码只需要直接操作代理对象即可.著名的代理模式的例子就是引用计数指针对象,它使得我们对真实对象的操作都需要经过引用计数指针对象.下面是用C++写的一个运用了代理模式的例子. #include <iostream> #include <string> using namespace std; // 作为接口的抽象基类 class Subject { public: virtual void DoAction()

设计模式之代理模式(Proxy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

【大话设计模式】——代理模式

对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到. Hibernate支持三种继承映射策略: 使用 subclass 进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态. 使用 joined-subclass 进行映射: 对于继承关系中的子类使用同一个表

设计模式之代理模式 c++实现以及详解

proxy模式 <1> 作用: 为其他对象提供一种代理以控制对这个对象的访问. <2> 代理模式的应用场景: 如果已有的方法在使用的时候需要对原有的方法进行改进,此时有两种办法: 1.修改原有的方法来适应.这样违反了"对扩展开放,对修改关闭"的原则. 2.就是采用一个代理类调用原有的方法,且对产生的结果进行控制.这种方法就是代理模式. 使用代理模式,可以将功能划分的更加清晰,有助于后期维护! <3> 结构图 代理类,含有一个指向RealSubject

JAVA设计模式之代理模式

学编程吧JAVA设计模式之代理模式发布了,欢迎通过xuebiancheng8.com来访问 一.概述 给某一个对象提供一个代理,并由代理对象来完成对原对象的访问.代理模式是一种对象结构型模式. 二.适用场景 当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口. 三.UML类图 四.参与者 1.接口类:Subject 它声明了真实访问者和代理访问者的共同接口,客户端通常需要针对接口角色进行编程. 2.代理类

JAVA设计模式(3)----代理模式

1.  什么是代理模式?Proxy Pattern 代理模式定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 通俗的讲,代理模式就是我很忙没空理你,你要想找我可以先找我的代理人,代理人和被代理人继承同一个接口.代理人虽然不能干活,但是被代理的人可以干活. 这个例子中有水浒传中的这么几个人:名垂青史的潘金莲,王婆,西门大官人.西门庆想要找潘金莲,需要找王婆做代理.首先定义一个接口:Kin

设计模式之代理模式20170724

结构型设计模式之代理模式: 一.含义 代理模式也叫做委托模式,其定义如下: 为其他对象提供一种代理以控制对这个对象的访问. 二.代码说明 1.主要有两个角色 1)具体主题角色 也叫做委托角色.被代理角色.它是业务逻辑的具体执行者. 2)代理主题角色 也叫做委托类.代理类.它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后处理工作. 一个代理类可以代理多个被委托者或被代理者. 2.在用C实现过程中也是参考这种思想,以游戏代理场