原理图:

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

至少在以下集中情况下可以用 Proxy 模式解决问题:
        1)创建开销大的对象时候,比如显示一幅大的图片,我们将这个创建的过程交给代理
去完成, GoF 称之为虚代理( Virtual Proxy);
        2)为网络上的对象创建一个局部的本地代理, 比如要操作一个网络上的一个对象( 网
络性能不好的时候,问题尤其突出),我们将这个操纵的过程交给一个代理去完成, GoF 称
之为远程代理( Remote Proxy);
        3) 对对象进行控制访问的时候, 比如在 Jive 论坛中不同权限的用户(如管理员、 普通
用户等) 将获得不同层次的操作权限, 我们将这个工作交给一个代理去完成, GoF 称之为保
护代理( Protection Proxy)。

根据代理的创建时期,代理模式分为静态代理和动态代理。

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

静态代理:

package design.proxy;//抽象主题
interface Subject {void Request();
}
package design.proxy;class ProxyTest {public static void main(String[] args) {Proxy proxy = new Proxy();proxy.Request();}
}//真实主题
class RealSubject implements Subject {public void Request() {System.out.println("访问真实主题方法...");}
}//代理
public class Proxy implements Subject {private RealSubject realSubject;public void Request() {if (realSubject == null) {realSubject = new RealSubject();}preRequest();realSubject.Request();postRequest();}public void preRequest() {System.out.println("访问真实主题之前的预处理。");}public void postRequest() {System.out.println("访问真实主题之后的后续处理。");}
}

结果:

访问真实主题之前的预处理。
访问真实主题方法...
访问真实主题之后的后续处理。

静态代理总结:

优点:可以做到在符合开闭原则的情况下对目标对象进行功能扩展。

缺点:我们得为每一个服务都得创建代理类,工作量太大,不易管理。同时接口一旦发生改变,代理类也得相应修改。可以用动态代理解决这些问题

动态代理:

类图如下:

代码:

package design.proxy;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class DynamicProxy implements InvocationHandler {private Object object;public DynamicProxy(final Object object) {this.object = object;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("动态代理 访问真实主题之前的预处理");Object result = method.invoke(object, args);System.out.println("动态代理 访问真实主题之后的后续处理");return result;}public static void main(String[] args) {Subject subject = new RealSubject1();  // 此处只需要用工厂模式,就可以根据业务参数动态提供不同的真实主题Subject realSubject = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), newClass[]{Subject.class}, new DynamicProxy(subject));realSubject.Request();subject = new RealSubject2();realSubject = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(), newClass[]{Subject.class}, new DynamicProxy(subject));realSubject.Request();}
}//真实主题
class RealSubject1 implements Subject {public void Request() {System.out.println("访问真实主题1方法...");}
}//真实主题
class RealSubject2 implements Subject {public void Request() {System.out.println("访问真实主题2方法...");}
}

结果:

动态代理 访问真实主题之前的预处理
访问真实主题1方法...
动态代理 访问真实主题之后的后续处理
动态代理 访问真实主题之前的预处理
访问真实主题2方法...
动态代理 访问真实主题之后的后续处理

参考文章:

设计模式---代理模式 - Dan_Go - 博客园

代理模式(代理设计模式)详解

sheng的学习笔记-设计模式-代理模式相关推荐

  1. 设计模式学习笔记之-代理模式

    2019独角兽企业重金招聘Python工程师标准>>>       代理模式中,客户不会直接调用目标对象而是通过一个代码对象,客户调用代理对象代理对象去调用目标对象,起到对象与对象间 ...

  2. 设计模式学习笔记之代理模式

    代理模式 为另一个对象提供一个替身或占位符以控制对这个对象的访问. 使用代理模式创建代表对象,让代表对象控制某个对象的访问,被代理的对象可以是远程的对象.创建开销大的对象或需要安全控制的对象. 在代理 ...

  3. sheng的学习笔记-设计模式-单例模式

    转载文章:​​​​​​Java单例模式的5种实现方法_明朗晨光的专栏-CSDN博客_单例模式java​​​​​​ 饿汉 类加载的时候就创建了实例 优点:类加载的时候创建一次实例,避免了多线程同步问题 ...

  4. 设计模式学习笔记——解释器(Interpreter)模式

    设计模式学习笔记--解释器(Interpreter)模式 @(设计模式)[设计模式, 解释器模式, Interpreter] 设计模式学习笔记解释器Interpreter模式 基本介绍 解释器案例 类 ...

  5. 设计模式学习笔记——命令(Command)模式

    设计模式学习笔记--命令(Command)模式 @(设计模式)[设计模式, 命令模式, command] 设计模式学习笔记命令Command模式 基本介绍 命令案例 类图 实现代码 Command接口 ...

  6. 设计模式学习笔记——状态(State)模式框架

    设计模式学习笔记--状态(State)模式框架 @(设计模式)[设计模式, 状态模式, State] 设计模式学习笔记状态State模式框架 基本介绍 状态案例 类图 实现代码 State接口 Day ...

  7. 设计模式学习笔记——备忘录(Memento)模式

    设计模式学习笔记--备忘录(Memento)模式 @(设计模式)[设计模式, 备忘录模式, memento] 设计模式学习笔记备忘录Memento模式 基本介绍 备忘录案例 类图 实现代码 Memen ...

  8. 设计模式学习笔记——观察者(Observer)模式

    设计模式学习笔记--观察者(Observer)模式 @(设计模式)[设计模式, 观察者模式, Observer] 设计模式学习笔记观察者Observer模式 基本介绍 观察者案例 类图 实现代码 Ob ...

  9. 设计模式学习笔记——外观(Facade)模式

    设计模式学习笔记--外观(Facade)模式 @(设计模式)[设计模式, 外观模式, facade] 设计模式学习笔记外观Facade模式 基本介绍 外观案例 类图 实现代码 Database类 ma ...

最新文章

  1. 大数据时代千帆竞发,三代测序激流勇进
  2. spring AOP注解含义
  3. ORACLE 表空间SQL
  4. dede config.chche.inc.php,dede/config.php · 辉辉菜/三强源码 - Gitee.com
  5. JavaScript中使Promise模式进行异步编程
  6. netflix_Netflix的Polynote
  7. Centos7 安装Rabbitmq-server和Erlang 仓库汇总
  8. 《Adobe Illustrator CC 2014中文版经典教程(彩色版)》—第1课0.8节编辑描边
  9. 常用API2 正则表达式
  10. USB2.0学习笔记连载(四):安装Cypress官网套件
  11. JDK 1.8 官网下载地址(linux / windows)
  12. keil5 社区版 使用教程 安装 下载 账号
  13. 支持向量机SVM思维导图
  14. mac 上查看字体文件的路径
  15. 用php做滚动,用PHP+java实现自动新闻滚动窗口
  16. php模板数组长度判断,Twig模板获取数组长度【原创】
  17. C语言:成绩等级划分!
  18. Java编程题-买苹果
  19. 大型门户网站的RBAC用户权限管理设计
  20. Google 员工愤然离职,剑指这家搜索巨头已迷失方向!

热门文章

  1. IntelliJ IDEA 的智能编码功能
  2. 2022年天猫七夕价格便宜吗?天猫七夕节有什么优惠?
  3. MICCAI 2020 Challenges相关数据集下载
  4. Bzoj4627 [BeiJing2016]回转寿司
  5. 九天毕昇深度学习平台常见环境问题及解决
  6. Java Gui 简介
  7. 南理工计算机考研人数,近5年南理工考研报录比
  8. R6030- CRT not initialized
  9. ora-12541:tns:无监听程序 无法识别
  10. [项目管理-12]:项目经理的困惑:项目管理的常见难题及解决对策