Java代理模式的深入了解

目录
  • 一、静态代理模式
    • 1.1、 代理模式的定义:
    • 1.2、代理模式的优缺点
  • 二、动态代理模式
  • 总结

一、静态代理模式

1.1、 代理模式的定义:

由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。

比如在有些情况下,一个客户不能或者不想直接访问另一个对象,这时需要找一个中介帮忙完成某项任务,这个中介就是代理对象。例如,购买火车票不一定要去火车站买,可以通过 12306 网站或者去火车票代售点买。又如找女朋友、找保姆、找工作等都可以通过找中介完成。

静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译,在程序运行前代理类的 .class 文件就已经存在了。

代码实例:实现增删改查操作,通过代理

接口:

package com.proxyPattern.staticProxy2;
/**
 * @author wang
 * @version 1.0
 * @packageName com.proxyPattern.staticProxy2
 * @className UserService
 * @date 2021/12/27 17:54
 * @Description 服务接口
 */
public interface UserService {
    void add();
    void delete();
    void update();
    void query();
}

真实类(这里是服务类)

package com.proxyPattern.staticProxy2;
/**
 * @author wang
 * @version 1.0
 * @packageName com.proxyPattern.staticProxy2
 * @className UserServiceImp
 * @date 2021/12/27 17:55
 * @Description 服务实现类
 */
public class UserServiceImp implements UserService{
    @Override
    public void add() {
        System.out.println("添加了一条数据");
    }
    @Override
    public void delete() {
        System.out.println("删除了一条数据");
    }
    @Override
    public void update() {
        System.out.println("修改了一条数据");
    }
    @Override
    public void query() {
        System.out.println("查询了一条数据");
    }
}

代理类

package com.proxyPattern.staticProxy2;
/**
 * @author wang
 * @version 1.0
 * @packageName com.proxyPattern.staticProxy2
 * @className UserServiceProxy
 * @date 2021/12/27 17:56
 * @Description 服务代理类
 */
public class UserServiceProxy implements UserService {
    private UserServiceImp userServiceImp;
    public UserServiceProxy() {
    }
    public void setUserServiceImp(UserServiceImp userServiceImp) {
        this.userServiceImp = userServiceImp;
    }
    @Override
    public void add() {
        getLog("add");
        userServiceImp.add();
    }
    @Override
    public void delete() {
        getLog("delete");
        userServiceImp.delete();
    }
    @Override
    public void update() {
        getLog("update");
        userServiceImp.update();
    }
    @Override
    public void query() {
        getLog("add");
        userServiceImp.query();
    }
    public void getLog(String message) {
        System.out.println("日志:" + message + "语句执行了");
    }
}

客户端测试类

package com.proxyPattern.staticProxy2;
/**
 * @author wang
 * @version 1.0
 * @packageName com.proxyPattern.staticProxy2
 * @className Customer
 * @date 2021/12/27 18:00
 * @Description 客户终端测试类
 */
public class Customer {
    public static void main(String[] args) {
        UserServiceImp userServiceImp = new UserServiceImp();
        UserServiceProxy p = new UserServiceProxy();
        p.setUserServiceImp(userServiceImp);
        p.add();
        p.update();
        p.delete();
        p.query();
    }
}
/**
 * 执行结果:
 * 日志:add语句执行了
 * 添加了一条数据
 * 日志:update语句执行了
 * 修改了一条数据
 * 日志:delete语句执行了
 * 删除了一条数据
 * 日志:add语句执行了
 * 查询了一条数据
 */

上述代码看到我们并没有使用userServiceImp去执行方法,而是使用了一个代理类去执行,这就是代理模式,类似于你租房并没有找房东租房,而是找的一个中间代理人中介来完成租房这个动作。

1.2、代理模式的优缺点

那么代理模式有哪些优点呢?

1、可以使得我们的真实角色更加纯粹 ,不再去关注一些公共的事情 
2、公共的业务由代理来完成 . 实现了业务的分工 
3、公共业务发生扩展时变得更加集中和方便

缺点

1、代理模式会造成系统设计中类的数量增加

2、在客户端和目标对象之间增加一个代理对象,会造成请求处理速度变慢;

3、增加了系统的复杂度;

如何解决这些问题呢?就靠下面的动态代理模式来解决

二、动态代理模式

动态,是指在程序运行时,运用反射机制动态创建而成

没错,动态的代理模式使用的是反射,而且要自己写一个动态代理类去动态的获取一个代理类

代码实例:案例同上,只不过采用的是动态代理模式

服务实现类(真实类)

package com.proxyPattern.staticProxy2;
/**
 * @author wang
 * @version 1.0
 * @packageName com.proxyPattern.staticProxy2
 * @className Customer
 * @date 2021/12/27 18:00
 * @Description 客户终端测试类
 */
public class Customer {
    public static void main(String[] args) {
        UserServiceImp userServiceImp = new UserServiceImp();
        UserServiceProxy p = new UserServiceProxy();
        p.setUserServiceImp(userServiceImp);
        p.add();
        p.update();
        p.delete();
        p.query();
    }
}
/**
 * 执行结果:
 * 日志:add语句执行了
 * 添加了一条数据
 * 日志:update语句执行了
 * 修改了一条数据
 * 日志:delete语句执行了
 * 删除了一条数据
 * 日志:add语句执行了
 * 查询了一条数据
 */

接口:

package com.proxyPattern. autoProxy;
/**
 * @author wang
 * @version 1.0
 * @packageName com.proxyPattern.staticProxy2
 * @className UserService
 * @date 2021/12/27 17:54
 * @Description 服务接口
 */
public interface UserService {
    void add();
    void delete();
    void update();
    void query();
}

动态代理类,这个几乎可以做一个工具类使用,因为格式固定

package com.proxyPattern.autoProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
 * @author wang
 * @version 1.0
 * @packageName com.proxyPattern.autoProxy
 * @className ProxyInvocationHandler
 * @date 2021/12/27 19:33
 * @Description 动态代理类
 */
public class ProxyInvocationHandler implements InvocationHandler {
    //被代理的接口
    private Object target;
    public void setTarget(Object target) {
        this.target = target;
    }
    /**
     * @Date  2021/12/27 19:36
     * @Param
     * @Return Object
     * @MetodName getProxy
     * @Author wang
     * @Description 生成得到代理类
     */
    public Object getProxy() {
        return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    /**
     * @Date  2021/12/27 19:34
     * @Param
     * @param proxy
     * @param method
     * @param args
     * @Return Object
     * @MetodName invoke
     * @Author wang
     * @Description 处理代理实例,并返回结果
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        log(method.getName());
        Object result = method.invoke(target, args);
        return result;
    }
    public void log(String message) {
        System.out.println("日志:" + message + "语句执行了" );
    }
}

客户端测试类:

package com.proxyPattern.autoProxy;
/**
 * @author wang
 * @version 1.0
 * @packageName com.proxyPattern.staticProxy2
 * @className Customer
 * @date 2021/12/27 18:00
 * @Description 客户终端测试类
 */
public class Customer {
    public static void main(String[] args) {
       //真实角色
        UserService userService = new UserServiceImp();
        //代理角色
        ProxyInvocationHandler pih = new ProxyInvocationHandler();
        //动态设置代理的对象
        pih.setTarget(userService);
        //动态生成代理类
        UserService proxy = (UserService) pih.getProxy();
        proxy.query();
        proxy.update();
    }
}
/**
 * 日志:query语句执行了
 * 查询了一条数据
 * 日志:update语句执行了
 * 修改了一条数据
 */

可以看到我们这里可以更方便的去获取代理类了,只需要将动态设置代理类那里的对象改一下,就可以去代理别的类。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java单例模式的深入了解

    目录 一.设计模式概览 1.1.软件设计模式的概念 1.2.软件设计模式的基本要素 1.3.GoF 的 23 种设计模式的分类和功能 1.4.软件设计的七大原则 二.单利模式 1.1.单例模式的相关定义 1.2.单利模式的结构 2.1单利模式的实现方式一:懒汉式 2.2单利模式的实现方式一:饿汉式 总结 一.设计模式概览 1.1.软件设计模式的概念 软件设计模式(Software Design Pattern),又称设计模式,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.它

  • Java工厂模式的深入了解

    目录 一.简单工厂模式 二.工厂方法模式 三.抽象工厂模式 3.1.抽象工厂模式的定义 3.2.  抽象工厂模式的结构 3.3抽象工厂模式代码示例 四.小结 一.简单工厂模式 何为简单工厂模式? 首先先通过一个案例来理解 我有一个需求,要买车,买车有不同的型号,那么我们常见的做法就是我买车点有什么车我就买什么车,实例如下 定义一个车接口 public interface Car { void name(); } 定义一个实现类,例如宝马 public class Baoma implements

  • Java观察者模式的深入了解

    目录 一.观察者模式的定义和特点 二.观察者模式的结构 三.代码实例 代码示例 总结 一.观察者模式的定义和特点 观察者模式的定义: 指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新.这种模式有时又称作发布-订阅模式.模型-视图模式,它是对象行为型模式. 特点: 1.降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系.符合依赖倒置原则. 2.目标与观察者之间建立了一套触发机制. 二.观察者模式的结构 实现观察者模式时要注意具体目标对象和

  • Java设计模式之职责链模式详解

    目录 前言 一.职责链模式的定义与特点 二.职责链模式的结构 三.职责链模式案例 前言 本文简单介绍了设计模式的一种--职责链模式  一.职责链模式的定义与特点 定义: 为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链:当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止. 比如我们的审批制度,低等级的审批不了的,交给上一级审批,依次类推,直到审批结束. 在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处

  • 深入理解Java设计模式之职责链模式

    目录 一.什么是职责链模式 二.职责链模式的结构 四.职责链模式的使用场景 五.职责链模式的实现 一.什么是职责链模式 二.职责链模式的结构 四.职责链模式的使用场景 五.职责链模式的实现 六.总结 六.总结 一.什么是职责链模式 客户端发出一个请求,链上的对象都有机会来处理这一请求,而客户端不需要知道谁是具体的处理对象.这样就实现了请求者和接受者之间的解耦,并且在客户端可以实现动态的组合职责链.使编程更有灵活性. 定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系.

  • Java装饰者模式的深入了解

    目录 一.装饰模式的定义和特点 二.装饰模式的结构 三.咖啡点单案例演示 代码实例: 四.总结 总结 一.装饰模式的定义和特点 在软件开发过程中,有时想用一些现存的组件.这些组件可能只是完成了一些核心功能.但在不改变其结构的情况下,可以动态地扩展其功能.所有这些都可以釆用装饰器模式来实现. 就像我们做菜,需要用到调料,菜,刀,火等一系列抽象的组件来最终完成一道菜. 装饰模式的定义: 指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式.就增加

  • Java职责链模式的深入了解

    目录 一.职责链模式的定义与特点 二.职责链模式的结构 三.职责链模式案例 总结 一.职责链模式的定义与特点 定义: 为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链:当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止. 比如我们的审批制度,低等级的审批不了的,交给上一级审批,依次类推,直到审批结束. 在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递.所以责任

  • java 代理模式及动态代理机制深入分析

    java 代理模式及动态代理机制深入分析 代理设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 代理模式一般涉及到的角色有: 抽象角色:声明真实对象和代理对象的共同接口: 代理角色:代理对象角色内

  • 23种设计模式(7) java代理模式

    23种设计模式第七篇:java代理模式 定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 角色: 1.抽象角色:声明真实对象和代理对象的共同接口. 2.代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装. 3.真实角色:

  • Java代理模式实例详解【静态代理与动态代理】

    本文实例讲述了Java代理模式.分享给大家供大家参考,具体如下: 即Proxy Pattern,23种java常用设计模式之一.代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问. Java的代理模式是Java中比较常用的设计模式,分为2中代理:静态代理与动态代理(JDK动态代理和cglib动态代理) 优点: 职责清晰 真实角色只需关注业务逻辑的实现,非业务逻辑部分,后期通过代理类完成即可. 高扩展性 不管真实角色如何变化,由于接口是固定的,代理类无需做任何改动. 缺点: 很明显的一点

  • Java代理模式实例分析

    本文实例讲述了Java代理模式.分享给大家供大家参考,具体如下: 一 不用代理模式的酒商 1 代码 class RealSubject // 真实角色(红酒厂商) { public void sell() { System.out.println("我是红酒厂商,欢迎品尝购买"); } } public class NoProxytest { // 客户端 public static void main( String[] args ) { RealSubject sub = new

  • Java代理模式的示例详解

    目录 定义 案例 需求 方案:静态代理模式 总结 定义 代理模式(Proxy Parttern) 为一个对象提供一个替身,来控制这个对象的访问,即通过代理对象来访问目标对象,这样做的话好处是可以在目标对象实现的基础上,进行额外的功能的扩展. 案例 需求 苹果公司通过苹果代理商来卖手机 方案:静态代理模式 定义抽象接口类,该类在代理模式中扮演的是一个抽象功能的角色,该案例中就是把出售手机抽象为了一个接口 /** * 售卖手机的接口(代理模式--抽象角色) * @author:liyajie * @

  • java代理模式与动态代理模式详解

    1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 生活中的例子:过年加班比较忙,没空去买火车票,这时可以打个电话到附近的票务中心,叫他们帮你买张回家的火车票,当然这会附加额外的劳务费.但要清楚票务中心自己并不卖票,只有火车站才真正卖票,票务中心卖给你的票其实是通过火车站实现的.这点很重要!

  • Java代理模式详细解析

    代理模式是我们比较常用的设计模式之一.其中新思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象.这些额外的操作通常需要与实际对象进行通信,代理模式一般涉及到的角色有: 抽象角色:声明真实对象和代理对象的共同接口: 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装. 真实角色:代理角色所代表的真实对象,

  • java代理模式(jdk proxy)

    目录 什么是代理 举个栗子 什么是代理模式 实现代理的方式 静态代理 根据以上过程,分析静态代理的优缺点 动态代理 CGLIB代理 JDK代理 InvocationHandler接口 Method类 Proxy类 jdk动态代理的实现步骤 总结 什么是代理 举个栗子 比如有一家美国的大学,可以对全世界招生.但是对于家长来说,家长不能直接自己去找学校,家长没有能力去直接访问学校,或者说,美国学校不接受个人来访,那么此时就需要一个留学中介来帮助这家美国学校招 生,中介就是学校的代理.中介和学校要做的

  • 一篇文章带你入门java代理模式

    目录 Java设计模式-代理模式 什么是代理模式? 代理模式 小结: 应用实例: 使用场景: 总结 Java设计模式-代理模式 什么是代理模式? 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式. 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 所谓的代理严格来讲就是两个子类共同实现一个接口,其中一个子类负责真实业务实现,另一个辅助完成主类业务逻辑操作. 代理模式 UML图: 源代码: interface ISubject

  • java代理模式(静态代理、动态代理、cglib代理)

    目录 代理模式 静态代理 代码 接口 被代理对象 代理对象 测试 动态代理 代码: 接口 目标对象 代理对象 测试 cglib代理 代码: 目标对象 代理对象 测试 应用 总结 代理模式 代理模式(Proxy Pattern)是一种结构性模式.代理模式为一个对象提供了一个替身,以控制对这个对象的访问.即通过代理对象访问目标目标对象,可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 被代理的对象可以是远程对象.创建开销答得对象或需要安全控制得对象.代理模式主要有三种形式,分别

随机推荐