原文首发于微信公众号:jzman-blog,欢迎关注交流!

今天来看一下什么是代理设计模式,顾名思义,代理就是通过中介代替某人做某一件事,对应到我们的程序中就是通过代理对象来控制某个具体对象某个方法的访问,在该方法之前和之后可以做一些额外处理。

  1. 概念理解
  2. 静态代理
  3. 动态代理

概念理解

  • 抽象角色:用于定义真实角色和代理角色共有的方法。
  • 真实角色:真实角色要实现的具体业务逻辑以供代理角色调用。
  • 代理角色:用于代理真实角色,可在真实角色具体逻辑前后进行额外处理。

那么代理的意义在于,当需要具体的业务逻辑时才调用真实角色的具体业务方法,即与真实角色具体业务逻辑无关的处理都放在代理类中的处理。

静态代理

先来看一下静态代理的代码实现,定义抽象角色声明共用的业务逻辑,具体如下:

/*** 抽象角色* @author jzman*/
public interface IBusiness {/*** 购物*/void buy();
}

然后,创建真实角色并完成具体的业务逻辑,具体如下:

/*** 真实角色* @author jzman*/
public class RealRole implements IBusiness{@Overridepublic void buy() {System.out.println("我要买东西");}
}

然后,创建代理角色,在进行具体业务逻辑的时候必须调用真实角色的业务逻辑方法,具体如下:

/*** 代理角色* @author jzman*/
public class ProxyRole implements IBusiness{private IBusiness mRealRole;public ProxyRole(IBusiness realRole) {this.mRealRole = realRole;}@Overridepublic void buy() {//购买之前的额外评估System.out.println("购买之前的额外评估...");//具体的业务逻辑mRealRole.buy();//购买之后的满意度调查System.out.println("购买之后的满意度调查...");}
}

最后,使用刚才创建的相关静态代理类,具体如下:

/*** 测试静态代理* @author jzman*/
public class StaticClient {public static void main(String[] args) {//创建真实角色IBusiness realRole = new RealRole();//创建代理角色IBusiness proxyRole = new ProxyRole(realRole);//代购帮你买东西proxyRole.buy();}
}

测试效果如下:

购买之前的额外评估...
我要买东西
购买之后的满意度调查...

这个案例中,代购不仅帮我们买到了东西,而且在购买行为发生之前和之后做了额外的处理,是不是比较非常灵活呢。

动态代理

上面了解了静态代理,那么动态代理与静态代理有什么区别呢,实际上静态代理和动态代理主要区别是静态代理需要自己生成代理类,而动态代理是在代码运行过程中自动生成代理类,那么动态代理如下实现呢,先来看一看 Java JDK 自带的实现动态代理的关键的两个类或接口,具体如下:

//用于动态生成代理类及其对象
java.lang.reflect.Proxy
//代理角色的调用处理程序需要实现的接口
//用于约束调用者的实现,抽象角色调用方法的时候会被该接口的invoke方法调用
java.lang.reflect.InvocationHandler

下面就来实现一下 Java JDK 自带的动态代理,首先抽象角色和真实角色和上文中静态代理的一样,这里就不在赘述,创建一个代理角色的调用处理程序如下:

/*** 代理角色的调用处理程序* @author jzman*/
public class BusinessHandler implements InvocationHandler{private IBusiness mRealRole;public BusinessHandler(IBusiness mRealRole) {super();this.mRealRole = mRealRole;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//购买之前的额外评估System.out.println("购买之前的额外评估...");//真实角色具体的业务逻辑method.invoke(mRealRole, args);//购买之后的满意度调查System.out.println("购买之后的满意度调查...");return null;}
}

使用 Proxy 的静态方法 newProxyInstance() 来生成代理对象,具体如下:

/*** 测试JDK自带的动态代理* @author jzman**/
public class DynamicProxyClient {public static void main(String[] args) {//创建真实角色IBusiness mRealRole = new RealRole();//创建处理器接口InvocationHandler handler = new BusinessHandler(mRealRole);/*** 获取代理角色对应的代理对象* newProxyInstance参数(类加载器,自动生成的代理类实现的接口,代理对象的调用处理程序)*/IBusiness proxy = (IBusiness) Proxy.newProxyInstance(handler.getClass().getClassLoader(), mRealRole.getClass().getInterfaces(), handler);//代理角色帮你买东西proxy.buy();}
}

上述代码的执行结果如下:

购买之前的额外评估...
我要买东西
购买之后的满意度调查...

学习静态代理有助于对动态代理的学习,两者主要的区别就是动态代理不需要写代理类,其相应的代理类会在代码运行期间动态生成,当然生成的代理类也实现了抽象角色对应的接口,同时创建个代理角色的调用者处理程序(InvocationHandler)也会接管具体的业务逻辑。关于静态代理和动态代理就到此为止。可以选择关注个人微信公众号:jzman-blog 获取最新更新,一起交流学习!

外观模式和代理模式的联系和区别_设计模式之代理设计模式相关推荐

  1. 外观模式和代理模式的联系和区别_设计模式之代理模式

    代理模式 Proxy Intro 代理模式,给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间 ...

  2. 策略模式和工厂模式的区别_设计模式之工厂模式-工厂方法模式

    设计模式之工厂模式-工厂方法模式 大家好,欢迎来到污污弹公司,今天司小司又接到了一个新活-披萨项目. 来源:凯哥Java(kaigejava) 需求: 披萨项目: 要方便披萨品种的扩展.要便于维护.要 ...

  3. 策略模式和工厂模式的区别_设计模式系列 — 策略模式

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(si ...

  4. plsql执行command命令控制台出现乱码_设计模式系列 — 命令模式

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(sin ...

  5. java 肌汉模式_设计模式之原型模式详解(附源代码)

    原型模式(Prototype Pattern) 原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. ...

  6. java桥接和装饰_设计模式:桥接模式和装饰模式

    原标题:设计模式:桥接模式和装饰模式 一.桥接模式简介 1.基础描述 桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是&qu ...

  7. 策略模式和工厂模式的区别_java设计模式之状态模式,策略模式孪生兄弟

    状态模式 状态模式(State Pattern)中,类的行为是基于它的状态改变的,状态之间的切换,在状态A执行完毕后自己控制状态指向状态B,状态模式是不停的切换状态执行.这种类型的设计模式属于行为型模 ...

  8. 如何定义适配器adapter类_设计模式22-Adapter(适配器)模式-组件接口适配

    在软件开发过程中,有时候系统的数据和行为都正确,但接口不符合,这时候我们就应该考虑使用适配器模式,适配器的作用即将一个类的接口转换成客户希望的另外一个接口.它使得原本由于接口不兼容而不能一起工作的那些 ...

  9. 策略设计模式_设计模式之策略模式总结

    再上一篇文章<设计模式之策略模式>中,我们通过模拟鸭子项目,了解了什么是策略模式,怎么使用策略模式.本文将通过鸭子项目的学习,对策略模式进行总结. 策略模式: 分别封装行为接口,实现算法族 ...

最新文章

  1. AI 一分钟 | 南京大学成立人工智能研究院;三星关联实体已收购 AI 搜索引擎创业公司Kngine的全部股份
  2. Ubuntu18.04安装keras(tensorflow)从无到有实录
  3. Zookeeper:基于Zookeeper的分布式锁与领导选举
  4. B00013 字符串哈希函数
  5. 每天定时打开某个网页_Python科普帖定时通知
  6. B 站崩了,受害程序员聊聊
  7. python单元测试mock_单元测试-具有多次调用方法的Python Mock对象
  8. python基本函数归整
  9. microsoft ppt制作小技巧
  10. .net excel循环插数据_[PaperReading]MEMC-Net 运动估计和运动补偿网络
  11. 静态初始化--我的理解
  12. Unity 改变鼠标指针的方法
  13. Unity 2017-2019各个版本unityhub下载连接
  14. docker镜像仓库habor1.10.0安装配置-单机版
  15. 用少量箭射爆气球,leetcode习题
  16. 计算机logo在线设计,手机上在线制作免费logo图标的APP—Logo Foundry
  17. @Scheduled出现Unexpected error occurred in scheduled task
  18. 传统的人事管理与人力资源管理有什么区别,后者有了什么新突破?
  19. 取得WINDOWS的管理员权限
  20. 第一章、计算机网络与英特网(重点知识梳理)

热门文章

  1. 十八般武艺玩转GaussDB(DWS)性能调优:SQL改写
  2. C++语言中std::array的神奇用法总结,你需要知道!
  3. 【经验】GaussDB(for MySQL)性能优化 —— 日志的“快递驿站”
  4. 云图说|DAS表结构对比与同步,实现您多个数据库管理心愿
  5. 【华为云实战开发】11.如何快速开展嵌入式开发项目?
  6. 被字句15个_成人高考要点解读、包含18个实用技巧
  7. Mybatis的resultMap自定义映射
  8. Android笔记 简单demo Spinner AutoCompleteTextView Menu
  9. 一句话解释什么是回归
  10. 特征工程系列学习(零)引言