加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

23种设计模式之代理模式

发布时间:2020-12-13 20:56:53 所属栏目:百科 来源:网络整理
导读:代理模式的定义 代理模式是一个使用率非常高的模式,其定义为: 为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫做委托模式,它是一项基本设计技巧. 许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式,而且在

代理模式的定义

代理模式是一个使用率非常高的模式,其定义为: 为其他对象提供一种代理以控制对这个对象的访问

代理模式也叫做委托模式,它是一项基本设计技巧. 许多其他的模式,如状态模式、策略模式、访问者模式本质上是在更特殊的场合采用了委托模式,而且在日常的应用中,代理模式可以提供非常好的访问控制.

代理模式的通用类图如下:

23种设计模式之代理模式

图中三个角色的定义:

  1. Subject抽象主题角色,抽象主题角色可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求
  2. RealSubject具体主题角色,也叫做委托角色、被代理角色,是业务逻辑的具体执行者
  3. Proxy代理主题角色,也叫做委托类、代理类,它负责对真实对象的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做预处理和善后工作

Proxy 代码为:

23种设计模式之代理模式

这样就实现了一个简单的代理

代理模式的应用

代理模式的优点:

  1. 职责清晰,真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件事务,附带的结果就是编程简洁清晰
  2. 高扩展性,具体主题角色是随时都会发生变化的,只要它实现了接口,甭管它如何变化,都逃不脱接口,我们的代理类完全就可以在不做任何修改的情况下使用
  3. 智能化

代理模式的使用场景:

为什么要用代理模式呢?就比如打官司,为什么要找个律师? 因为你不想参与中间过程的是是非非,只要完成自己的答辩就成,其他的事前调查、事后追查等都由律师来搞定,这就是为了减轻你的负担

代理模式的扩展

1.普通代理模式

普通代理就是我们要知道代理的存在,也就是 Proxy 这个类的存在,然后才能访问,普通代理模式下的Proxy类代码:

23种设计模式之代理模式

在这种改造下,系统更加简洁了,调用者只知道代理的存在就可以,不用知道代理了谁. 屏蔽了真实角色的变更对高层模块的影响,真实的角色想怎么修改就怎么修改,对高层次的模块没有任何的影响,只要你实现了接口所对应的方法,该模式非常适合对扩展性要求极高的场合.

2.强制代理

强制代理就是调用者直接调用真是角色,而不用关心代理是否存在,其代理的产生是由真实角色决定的,也就是说强制代理不管你是通过代理类还是通过直接new一个角色类,都不能访问,只有通过真是角色指定的代理类才可以访问,也就是说真实对象管理代理角色. 这么说,高层模块new了一个真实角色的对象,返回的却是代理角色.

修改后的代码如下:

23种设计模式之代理模式

代理类如下:

23种设计模式之代理模式

真实类如下:

23种设计模式之代理模式

这样通过使用 new RealSubject().getProxy(); 就可以通过真实角色找到代理了

强制代理的概念就是要从真实角色查找到代理角色. 高层模块只要调用getProxy就可以访问真实角色的所有方法,代理的管理已经由真实角色自己完成

3.个性代理类

代理类也可以实现其他接口,实现其他方法,当然也可以代理多个真实角色,并且真实角色之间可以有耦合关系.

4.动态代理

什么是动态代理?动态代理是在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象.

动态代理需要实现 InvocationHandler 接口:

23种设计模式之代理模式

通过 InvocationHandler 接口,所有的方法都被它接管了,我们在使用的时候只需这样创建代理类:

23种设计模式之代理模式

这样,subject就是代理后的类

面向切面编程,即AOP,其核心就是采用了动态代理机制

注意: 要实现动态代理的首要条件是,被代理类必须实现了一个接口


代理模式应用的非常广泛,大到一个系统框架、企业平台,小到代码片段、事务处理,稍不留意就用到代理模式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读