`
zhangwei_david
  • 浏览: 474743 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java 设计模式-代理模式(Proxy Pattern)

 
阅读更多

      所谓代理,就是一个 人或者一个机构代表另一个人或者机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。

     代理模式的角色:

  • 抽象主题角色:声明了真实主题和代理主题角色的共同接口,这样在任何使用真实主题的地方都可以使用代理主题。
  • 代理主题角色:代理主题角色持有真实主题角色的引用,从而可以在任何使用操作真实主题的角色;代理主题角色提供了和真实主题角色相同的接口,以便在任何时候可以替换真实主题角色。
  • 真实主题角色:定义了代理角色所代表的真实角色。
 代理模式可以分为 静态代理和动态代理(Spring 等框架中使用的都是动态代理); 而动态代理根据实现方式又可以分为Jdk 动态代理和CGLIB 动态代理
/**
 * 抽象的主题角色,声明了真实主题和代理主题的共同接口,这样在任何使用真实主题的地方都可以使用代理主题
 * @author zhangwei_david
 * @version $Id: AbstractTopic.java, v 0.1 2014年10月26日 上午7:52:11 zhangwei_david Exp $
 */
public interface AbstractTopic {
    /**
     * 请求
     */
    public void request();
}

/**
 *
 * @author zhangwei_david
 * @version $Id: RealTopic.java, v 0.1 2014年10月26日 上午7:54:04 zhangwei_david Exp $
 */
public class RealTopic implements AbstractTopic {

    /**
     * @see com.cathy.demo.pattern.proxy.AbstractTopic#request()
     */
    public void request() {
        System.out.println("真实主题接收到请求");
    }

}

/**
 *
 * @author zhangwei_david
 * @version $Id: ProxyToptic.java, v 0.1 2014年10月26日 上午7:55:01 zhangwei_david Exp $
 */
public class ProxyToptic implements AbstractTopic {

    private AbstractTopic realTopic;

    /**
     * @see com.cathy.demo.pattern.proxy.AbstractTopic#request()
     */
    public void request() {
        preRequest();
        realTopic.request();
    }

    /**
     *
     */
    private void preRequest() {
        System.out.println("代理角色,前置请求参数检查");
    }

    public ProxyToptic(AbstractTopic realTopic) {
        super();
        this.realTopic = realTopic;
    }

}

/**
 *
 * @author zhangwei_david
 * @version $Id: Client.java, v 0.1 2014年10月26日 上午7:56:52 zhangwei_david Exp $
 */
public class Client {

    /**
     *
     * @param args
     */
    public static void main(String[] args) {

        AbstractTopic topic = new ProxyToptic(new RealTopic());
        topic.request();
    }

}

 

上述是静态代理模式,代理模式还有动态代理模式:

/**
 * 抽象的主题角色
 * @author zhangwei_david
 * @version $Id: Subject.java, v 0.1 2014年10月21日 下午4:44:11 zhangwei_david Exp $
 */
public interface Subject {
    // 抽象的方法
    public void request();
}

 

/**
 *
 * @author zhangwei_david
 * @version $Id: RealSubject.java, v 0.1 2014年10月21日 下午4:45:09 zhangwei_david Exp $
 */
public class RealSubject implements Subject {

    /**
     * @see com.cathy.demo.pattern.DynamicProxy.Subject#request()
     */
    public void request() {
        System.out.println("Real request handler");
    }

}

 

/**
 *
 * @author zhangwei_david
 * @version $Id: SubjectHandler.java, v 0.1 2014年10月21日 下午4:55:33 zhangwei_david Exp $
 */
public class SubjectHandler implements InvocationHandler {

    private Subject subject;

    /**
     * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
     */
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object obj = null;
        System.out.println("Before");
        obj = method.invoke(subject, args);
        System.out.println("after");
        return obj;
    }

    public SubjectHandler(Subject subject) {
        super();
        this.subject = subject;
    }

}

 

/**
 *
 * @author zhangwei_david
 * @version $Id: DynamicProxyTest.java, v 0.1 2014年10月21日 下午4:58:50 zhangwei_david Exp $
 */
public class DynamicProxyTest {

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        Subject real = new RealSubject();
        InvocationHandler handler = new SubjectHandler(real);
        ClassLoader cl = Subject.class.getClassLoader();
        Subject proxy = (Subject) Proxy.newProxyInstance(cl, real.getClass().getInterfaces(),
            handler);
        proxy.request();
    }

 

 关于CGLIB实现的动态代理模式请参考CGLIB之MethodInterceptor

3
2
分享到:
评论
3 楼 zhangwei_david 2014-10-30  
就是简单的介绍一下,
2 楼 diyutaizi3721 2014-10-27  
你这是"策略模式"吧....代理模型 真实功能点没有体现出来吧
1 楼 dingxuemeiwang 2014-10-27  
学习了。。就是介绍了貌似有点简单了。。。。

相关推荐

    JAVA设计模式-chm版

    Java设计模式是软件开发中的一种最佳实践,它总结了在解决特定问题时程序员们经常采用的有效方法。这个“JAVA设计模式-chm版”资源显然包含了关于Java设计模式的详细信息,便于理解和应用。设计模式是对常见问题的...

    java常用设计模式-代理模式

    代理模式(Proxy Pattern)是一种常用的设计模式,提供了间接访问目标对象的一种方式,即通过代理对象访问目标对象。这样做的好处是,可以在不改变原有目标对象的基础上,对目标对象增加额外的扩展功能。 代理模式...

    java 设计模式之代理模式(Proxy Pattern)实现代码及设计详解:动态代理模式、静态代理模式

    Java设计模式是软件开发中的重要概念,它提供了一套通用的解决方案模板,使得代码更加可复用、可扩展。在这些模式中,代理模式(Proxy Pattern)是一种常用的结构型设计模式,它允许我们为一个对象创建一个代理,该...

    JAVA design pattern-java设计模式

    总结来说,"JAVA design pattern-java设计模式"的CHM文件是深入学习和理解Java设计模式的宝贵资源,通过学习和应用这些模式,开发者可以提高其代码质量,优化系统架构,从而更好地应对复杂的软件开发挑战。

    design-pattern-java.pdf

    实现对象的复用——享元模式(二) 实现对象的复用——享元模式(三) 实现对象的复用——享元模式(四) 实现对象的复用——享元模式(五) 代理模式-Proxy Pattern 设计模式之代理模式(一) 设计模式之代理模式...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    8. **代理模式(Proxy Pattern)**:为其他对象提供一种代理以控制对这个对象的访问,比如远程代理、虚拟代理、缓存代理等。 9. **桥接模式(Bridge Pattern)**:将抽象部分与它的实现部分分离,使它们都可以独立...

    设计模式课程设计---使用5个以上不同的设计模式完成(java)

    4. **代理模式(Proxy Pattern)**:代理模式为其他对象提供一种代理以控制对这个对象的访问。在Java中,我们可以使用动态代理(`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`)或者静态代理...

    设计模式之代理模式proxy

    **设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...

    Android设计模式之代理模式(Proxy Pattern)

    代理模式是设计模式的一种,它的主要目的是在不改变原有对象的基础上,为一个对象提供额外的功能或者控制对这个对象的访问。在Android开发中,代理模式的应用尤为常见,尤其在处理复杂的业务逻辑、网络请求、界面...

    design-pattern-Java设计模式

    Java设计模式是软件开发中的重要概念,它是一种在特定情境下解决常见问题的经验总结和标准解决方案。设计模式并不直接提供代码实现,而是提供了一种通用的语言,让开发者能够更好地理解和交流复杂的系统架构。这些...

    这是一套 Java 设计模式的集合示例-design-pattern.zip

    Java设计模式是软件工程中的一种最佳实践,它们是解决常见编程问题的经验总结,可以提高代码的可重用性、可维护性和可扩展性。在"design-pattern.zip"这个压缩包中,我们很可能会找到一系列与Java设计模式相关的代码...

    Java设计模式(第二版)中文版

    - **代理模式**(Proxy Pattern) - **行为型模式**:关注于算法与对象之间的分配,以及它们之间的通信机制。 - **策略模式**(Strategy Pattern) - **模板方法模式**(Template Method Pattern) - **观察者...

    java设计模式ppt

    代理模式 (Proxy Pattern) 代理模式是一种结构型模式,为其他对象提供一个代理以控制对该对象的访问。代理模式主要用于添加额外的功能,如权限检查、性能优化等,而不会影响原始对象的实现。 #### 7. 原型模式 ...

    设计模式java源码-design-pattern:java设计模式源代码

    这个名为"design-pattern:java设计模式源代码"的压缩包文件很可能是包含了多种Java实现的设计模式示例。 首先,我们来看看主要的设计模式分类: 1. 创建型模式:这类模式涉及到对象的创建,如单例模式(Singleton...

    设计模式 之 “代理模式[Proxy Pattern]”

    **代理模式(Proxy Pattern)**是软件设计模式中的结构型模式之一,它在对象访问控制、增加额外功能或在客户端与目标对象之间提供一个中介等方面有广泛的应用。在代理模式中,代理类作为真实对象的代表,它持有真实...

    设计模式整理代码-pattern.zip

    - 代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。 - 外观模式(Facade):为子系统提供一个统一的接口,使得子系统的复杂性对客户透明。 - 适配器模式(Adapter):使两个不兼容的接口能够...

    Java与模式-我修改过的源代码

    8. **代理模式**(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问。在Java中,静态代理和动态代理(JDK Proxy和CGLIB)是常见实现。修改可能涉及性能优化或权限控制的增强。 9. **命令模式**...

    Java高手真经 - Java Web系统设计与架构 源代码(一)设计模式

    pattern/src/structure/proxy //12.3代理模式 pattern/src/structure/facade //12.4外观模式 pattern/src/structure/bridge //12.5桥接模式 pattern/src/structure/composite //12.6组合模式 pattern/src/...

Global site tag (gtag.js) - Google Analytics