`

代理模式(基于接口)

 
阅读更多
一、代理模式简介
代理模式的作用是:为其他对象提供一种代理,以控制对该对象的访问。在某种情况下,一个客户不想或者不能直接引用另一个对象,此时代理对象可以在客户端 和目标对象之间起到中介的作用。代理模式有如下特点:

职责清晰:真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
代理对象:可以在客户端和目标对象之前起到中介的作用,这样保护了目标对象
高扩展性
  代理模式UML图如下:



二、代理模式实现

  代理模式一般涉及到的角色如下:

抽象角色:声明真实对象和代理对象的共同接口
代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装
真实角色:代理角色所代表的真实对象,是我们最终要引用的对象
  我们使用到JDK提供的代理类来实现动态代理。
1、创建Subject接口(抽象角色)
 package com.test.dynamicproxy;

 public interface Subject
 {
     public void request();
}


2、创建RealSubject类(真实角色)
package com.test.dynamicproxy;

public class RealSubject implements Subject
{
    public void request()
    {
        System.out.println("From real subject!");
    }

}


3、创建DynamicSubject(该类用于产生代理对象)
package com.test.dynamicproxy;

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

/**
 * 该代理类的内部属性是Object类型,实际使用的时候通过该类的构造方法传递进来一个对象
 * 此外,该类还实现了invoke方法,该方法中的method.invoke其实就是调用被代理对象的将要
 * 执行的方法,方法参数是sub,表示该方法从属于sub,通过动态代理类,我们可以在执行真实对象的方法前后 加入自己的一些额外方法。
 * 
 */

public class DynamicSubject implements InvocationHandler {
    private Object target;

    public Object bind(Object target) {
        this.target = target;
        //返回代理对象
        return Proxy.newProxyInstance(target
                .getClassLoader(), target.getClass().getInterfaces(),
                this);
    }

    
    /**
     *@param proxy 代理对象
     * 
     *@param method 要代理的方法
     *
     *@param args 该方法的参数对象数组
     *
     *@return
     */
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        System.out.println("before calling: " + method);
        //返回值
        Object result = null ;

        result = method.invoke(target, args);// 调用真实对象的方法,通过反射来调用

        System.out.println("after calling: " + method);

        return result ;
    }
 
    
}


4、调用类Client

package com.test.dynamicproxy;

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

public class Client {
    public static void main(String[] args) {
        // 创建真实对象
       InvocationHandler proxy  = new DynamicSubject();
        
       Subject subject = (Subject)proxy.bind(new RealSubject());
    }
}
  • 大小: 15.5 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    java中的三种代理模式

    在Java编程中,代理模式是一种常用的面向对象设计模式,它允许我们为一个对象提供一个代理以控制对该对象的访问。代理模式通常用于增加额外的功能,如日志、权限检查等,或者为了创建虚拟代理以提高性能。以下是Java...

    java代理模式

    JDK动态代理是基于接口的,它通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口实现。我们只需要实现InvocationHandler接口,然后在其中处理实际的业务逻辑,Proxy类会根据指定的接口生成...

    设计模式实现——代理模式

    **设计模式实现——代理模式** 在软件工程中,设计模式是一种通用可重用的解决方案,它描述了在特定上下文中经常出现的问题以及该问题的解决方案。代理模式是设计模式的一种,它提供了一种对目标对象的间接访问方式...

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    动态代理设计模式 日志和源码

    JDK动态代理基于接口实现。首先,我们需要定义一个或多个接口,然后创建一个实现了这些接口的代理类。这个代理类通常会实现InvocationHandler接口,重写其中的`invoke()`方法。`invoke()`方法会在调用代理对象的方法...

    cas代理模式代码示例

    在IT行业中,代理模式是一种常见的设计模式,它允许我们在不修改原有对象的基础上,为对象添加新的功能或控制访问。在本示例中,我们将重点讨论如何在Java环境下使用代理模式来实现代理逻辑,特别是在CAS(Central ...

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

    2. jdk 动态代理:jdk 动态代理是基于接口的一种代理方式,目标对象一定要实现接口。原理是,利用反射机制,动态生成匿名类继承 `Proxy` 类并且实现了要代理的接口,由于 Java 不支持多继承,所以 JDK 动态代理不能...

    设计模式之代理模式proxy.zip

    JDK动态代理基于接口实现,它要求目标对象必须实现至少一个接口,然后通过Proxy类和InvocationHandler接口来创建并控制代理对象。当我们调用代理对象的方法时,实际执行的是InvocationHandler的invoke方法,这样可以...

    设计模式专题,代理模式,工厂模式

    JDK动态代理基于接口实现,它在运行时动态创建代理类,无需预先编写代理类的代码。CGLIB则是通过字节码技术生成代理类,适用于没有接口的情况。 代理模式的主要应用场景包括: - 控制访问:例如,权限检查、日志...

    简单工厂,代理模式,单例模式demo

    在软件设计模式中,"简单工厂"、"代理模式"和"单例模式"是非常重要的概念,它们在实际开发中有着广泛的应用。下面将详细解释这三个设计模式,并结合标签中的"源码"和"工具",探讨它们在实际项目中的应用。 首先,...

    js策略模式和代理模式

    代理模式中的代理对象和目标对象实现相同的接口,客户端与代理对象进行交互,代理对象则根据具体情况决定是否将请求转给目标对象。在JavaScript中,代理模式可用于控制对象访问、惰性初始化、访问日志记录等。 ...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    ### Java 代理模式详解 #### 1. 代理模式概览 代理模式是一种设计模式,主要目的是为了控制或提供对某对象的访问。在代理模式中,代理对象充当客户端与真实对象之间的中介,使得客户端可以通过代理对象间接地访问...

    MyBatis-基于接口代理模式开发.rar

    mybatis

    设计模式之代理模式

    代理模式在软件工程中的应用广泛,比如Spring框架中的AOP(面向切面编程)就是基于动态代理实现的,它可以对方法调用前后进行拦截,实现日志记录、性能监控、事务管理等功能。 在阅读《设计模式之代理模式》这篇...

    设计模式_基于C#的工程化实现及扩展_源码

    代理模式为其他对象提供一种代理以控制对这个对象的访问,可以用于远程代理、虚拟代理等场景。 7. MarvelousWorks.PracticalPattern_12 可能涵盖了“建造者模式”。建造者模式将复杂对象的构建与其表示分离,使得...

    代理模式及动态代理资料和源代码

    代理模式是一种常用的设计模式,它在软件开发中起到了中介或者代表的作用,允许我们通过一个对象来控制对另一个对象的访问。在Java和Spring框架中,动态代理更是扮演着重要角色,尤其是在实现面向切面编程(AOP)时...

    23钟设计模式之代理模式

    JDK中的动态代理就是基于接口的,通过`java.lang.reflect.InvocationHandler`和`java.lang.reflect.Proxy`类来实现。 总的来说,代理模式提供了一种在不修改原有代码的情况下扩展或控制对象行为的方法,增强了软件...

    proxy.rar java三种代理模式源码

    代理模式通常分为三种类型:静态代理、动态代理和接口代理(也称为JDK动态代理)。这个"proxy.rar"压缩包中包含了这三种代理模式的源代码示例,以及对泛型的应用。 1. 静态代理: 静态代理是最基础的代理形式,它...

    《设计模式--基于C#的工程化实现及扩展》.(王翔)_《0528》.rar

    结构型模式关注如何将对象和类组合成更大的结构,如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy)等,它们提供了更好的抽象和接口集成。行为型模式则关注对象之间的交互和职责分配,如策略...

Global site tag (gtag.js) - Google Analytics