23种设计模式之代理模式

代理模式的定义

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

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

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

图中三个角色的定义:

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

Proxy 代码为:

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

代理模式的应用

代理模式的优点:

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

代理模式的使用场景:

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

代理模式的扩展

1.普通代理模式

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

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

2.强制代理

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

修改后的代码如下:

代理类如下:

真实类如下:

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

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

3.个性代理类

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

4.动态代理

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

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

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

这样, subject就是代理后的类

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

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



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



可以关注一下鄙人的公众号, 谢谢各位了!

原文地址:https://www.cnblogs.com/hujingnb/p/10171550.html

时间: 2024-08-01 22:46:22

23种设计模式之代理模式的相关文章

23种设计模式之代理模式(Proxy)

代理模式是一种对象结构型模式,可为某个对象提供一个代理,并由代理对象控制对原对象的引用.代理模式能够协调调用者和被调用者,能够在一定程度上降低系统的耦合度,其缺点是请求的处理速度会变慢,并且实现代理模式需要额外的工作. 优点: 1)远程代理可以隐藏对象位于不同的地址空间的事实. 2)虚拟代理可以执行优化操作,例如根据需要创建一个对象. 使用场景:需要比简单的指针更灵活.更全面的对象引用. Proxy 模式

java实现23种设计模式之代理模式

看代码: package com.ceshi7; public interface Sourceable { public void method(); } package com.ceshi7; public class Source implements Sourceable{ @Override public void method() { System.out.println("这是原方法!"); } } package com.ceshi7; public class Pro

Java经典23种设计模式之创造型模式(二)

本文记录5种创造型模式的剩下两种:建造者模式(Builder).原型模式(PROTOTYPE). 一.建造者模式(别名:生成者模式) 将复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示.一个完整的建造者模式包含以下几个概念: 1.产品类 Product public class Person { private String head; private String body; private String foot; public String getHead() { ret

JAVA开发的23种设计模式之 --- 桥接模式

桥接模式 概述:将抽象部分与他的实现部分分离,这样抽象化与实现化解耦,使他们可以独立的变化.如何实现解耦的呢,就是通过提供抽象化和实现化之间的桥接结构.    应用场景        实现系统可能有多个角度分类,每一种角度都可能变化.    解释:桥接模式将继承模式转化成关联关系,他降低了类与类之间的耦合度,减少了系统中类的数量,也减少了代码量.    理解抽象化,实现化,解耦        抽象化:将复杂物体的一个或几个共同的特性抽出去而只注意其他特性的行动或过程.在java面向对象中抽象化就

Java经典23种设计模式之创造型模式(一)

设计模式被称为程序猿的内功,之前零零散散的看过一大部分,但自己么有总结过.故此次在这里总结下.值得一提的是,设计模式并不是Java所特有.由于一直搞Android.这里就用Java为载体.最经典的设计模式有23种,分三个大类型: 创建型模式(5) .结构型模式(7).行为型模式(11),5 + 7 +11 = 23.网上一搜也都是一大把了,这里不过个人作的记录.本文记录创造型模式里的工厂方法(Factory Method).抽象工厂(Abstract Factory).单例模式这三种.力求透彻.

二十三种设计模式[12] - 代理模式(Proxy Pattern)

前言 代理模式,属于对象结构型模式.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 为其它对象提供一种代理以控制对这个对象的访问 ". 在代理模式中,通常使用一个类来代表另一个类的功能,并由这个代理对象去控制原对象的引用. 结构 Subjuet(公共接口):代理类和被代理类的公共接口,保证任何使用目标的地方都可以被代理类替换: RealSubject(被代理类):代理类所代表的目标类: Proxy(代理类):包含对目标类的引用,目标类的封装: 场景 在日常生活中

23种设计模式(19)---Command模式

命令(Command)模式属于对象的行为模式[GOF95].命令模式又称为行动(Action)模式或交易(Transaction)模式.命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 命令模式是对命令的封装.命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象. 每一个命令都是一个操作:请求的一方发出请求要求执行一个操作:接收的一方收到请求,并执行操作.命令模式允许请求的一方和接收的

23种设计模式之原型模式(Prototype)

在系统开发过程中,有时候有些对象需要被频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后通过复制这个原型对象的办法,创建出更多同类型的对象.原型模式是一种对象创建型模式,用原型实例制定创建对象的种类,并且通过复制这些原型创建新的对象.原型模式又可分为两种:浅克隆和深克隆.浅克隆仅仅复制所考虑的对象,而不复制它所引用的对象,也就是其中的成员对象并不复制:深克隆除了对象本身被复制外,对象包含的引用也被复制,即成员对象也被复制. 优点: 1)可以在运行时添加或删除产品. 2)通过改

23种设计模式-----创建型模式、结构型模式

一.创建型模式(都是用来帮助创建对象的) 1.单例模式 作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 应用:Windows的任务管理器.回收站:项目中读取配置文件的类:网站的计数器:应用程序的日志应用:数据库连接池:操作系统的文件系统:Application:Spring中的bean:Servlet:spring MVC框架/struts1框架中的控制器对象 选用:占用资源小.不需要延时加载--------枚举-->饿汉           占用资源大 .需要延时    --