核心作用:

通过代理,控制对对象的访问

可以详细控制某个对象的方法,在调用这个方法做前置处理,调用这个方法后做后置处理(AOP的微观实现)

AOP(Aspect Oriented Programming)

面向切面编程的核心实现机制

核心角色:

抽象角色:定义代理角色和真实角色的公共对外方法

真实角色:实现抽象角色,定义真实角色索要实现的业务逻辑,供代理角色调用(关注真正的业务逻辑)

代理角色:实现抽象角色,是真实的角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作(将统一的流程控制放到代理角色中进行处理)

应用场景:

安全代理:屏蔽对真实角色的直接访问

远程代理:通过代理类处理远程方法调用(RMI)

延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象

分类:

静态代理:静态定义代理类

动态代理:动态生成代理类

jdk自带的动态代理

javaassist字节码操作库实现

CGLIB

ASM(底层使用指令)

举例:

歌手唱歌

  1. package com.littlepage.ProxyParttern;
  2.  
  3. public interface Star {
  4. //面谈
  5. void confer();
  6. //签合同
  7. void signContract();
  8. //订票
  9. void bookTicket();
  10. //唱歌
  11. void sing();
  12. //收钱
  13. void collectMoney();
  14. }
  1. package com.littlepage.ProxyParttern;
  2.  
  3. public class ProxyStar implements Star{
  4. private Star star;
  5.  
  6. public ProxyStar(Star star) {
  7. super();
  8. this.star = star;
  9. }
  10.  
  11. @Override
  12. public void confer() {
  13. System.out.println("Proxy Star Confer");
  14. }
  15.  
  16. @Override
  17. public void signContract() {
  18. System.out.println("Proxy Star SignContract");
  19. }
  20.  
  21. @Override
  22. public void bookTicket() {
  23. System.out.println("Proxy Star BookTicket");
  24. }
  25.  
  26. @Override
  27. public void sing() {
  28. star.sing();
  29. }
  30.  
  31. @Override
  32. public void collectMoney() {
  33. System.out.println("Proxy Star CollectMoney");
  34. }
  35. }
  1. package com.littlepage.ProxyParttern;
  2.  
  3. public class RealStar implements Star{
  4.  
  5. @Override
  6. public void confer() {
  7. System.out.println("Real Star Confer");
  8. }
  9.  
  10. @Override
  11. public void signContract() {
  12. System.out.println("Real Star SignContract");
  13. }
  14.  
  15. @Override
  16. public void bookTicket() {
  17. System.out.println("Real Star BookTicket");
  18. }
  19.  
  20. @Override
  21. public void sing() {
  22. System.out.println("Real Star Sing");
  23. }
  24.  
  25. @Override
  26. public void collectMoney() {
  27. System.out.println("Real Star CollectMoney");
  28. }
  29.  
  30. }
  1. package com.littlepage.ProxyParttern;
  2.  
  3. public class Client {
  4. public static void main(String[] args) {
  5. RealStar rs=new RealStar();
  6. ProxyStar ps=new ProxyStar(rs);
  7.  
  8. ps.confer();
  9. ps.signContract();
  10. ps.bookTicket();
  11. ps.sing();
  12. }
  13. }

UML图:

设计模式(八)Proxy Parttern 代理模式的更多相关文章

  1. 【转】设计模式(十一)代理模式Proxy(结构型)

    设计模式(十一)代理模式Proxy(结构型) 1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ...

  2. Java设计模式(10)代理模式(Proxy模式)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

  3. 设计模式之jdk动态代理模式、责任链模式-java实现

    设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...

  4. <四>读<<大话设计模式>>之代理模式

    代理模式我想大家即便不熟悉也都听过吧,从字面意思上看就是替别人干活的,比方代理商.在项目的实际应用中也有非常多地方用到.比方spring通过代理模式生成对象等. 代理模式的书面定义:为其它对象提供一种 ...

  5. 设计模式(十一)代理模式Proxy(结构型)

    1.概述 因为某个对象消耗太多资源,而且你的代码并不是每个逻辑路径都需要此对象, 你曾有过延迟创建对象的想法吗 ( if和else就是不同的两条逻辑路径) ? 你有想过限制访问某个对象,也就是说,提供 ...

  6. C#设计模式之十二代理模式(Proxy Pattern)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是“结构型”设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看.“代理”可以理 ...

  7. Java设计模式—Proxy动态代理模式

    代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代 ...

  8. 设计模式(十三)代理模式(Proxy Pattern)

    一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...

  9. 开发设计模式(四) 代理模式(Proxy Pattern)

    转自http://blog.sina.com.cn/s/blog_89d90b7c0101803g.html 代理模式:代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问.在某些情况下, ...

随机推荐

  1. python之运算符与基本数据类型

    1.开发工具:IDE pycharm(推荐).eclipse 2.运算符 结果是值 算数运算 a = 10 * 10 赋值运算 a = a + 1    a+=1 结果是布尔值 比较运算 a = 1 ...

  2. JS中常见原生DOM操作API

    摘自:https://blog.csdn.net/hj7jay/article/details/53389522 几种对象 Node Node是一个接口,中文叫节点,很多类型的DOM元素都是继承于它, ...

  3. 安装使用zookeeper

    1,加压 2,复制zoo_sample.cfg命名为zoo.cfg 3,在conf同级目录下新建一文件夹 data 4,修改数据存放目录 5,启动zookeeper

  4. C++中虚函数的作用

    一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你就应该从这里开始) 简单地说,那些被virtual关键字修饰的成员函数,就是虚函数.虚函数的作用,用专业术语来解释就是实现多态性(Po ...

  5. Kattis之旅——Divisible Subsequences

    Given a sequence of positive integers, count all contiguous subsequences (sometimes called substring ...

  6. ES6知识整理(8)--Promise对象

    (关于promise,以前并不知道是什么,没这个概念.现在来学习总结下) promise含义 es6的异步编程解决方案.需要new新对象操作api. promise对象特点 有3中状态:pending ...

  7. 控制层和ajax用法的详解

    商城项目第二天复习的内容 package cn.tedu.store.entity; public class ResponseResult<T> { public static fina ...

  8. ELK学习笔记之F5 DNS可视化让DNS运维更安全更高效-F5 ELK可视化方案系列(3)

    0x00 概述 此文力求比较详细的解释DNS可视化所能带来的场景意义,无论是运维.还是DNS安全.建议仔细看完下图之后的大篇文字段落,希望能引发您的一些思考. 在“F5利用Elastic stack( ...

  9. MQ选型对比RabbitMQ RocketMQ ActiveMQ Kafka(外加redis对比及其实现)

    rocketmq 4.3开始支持事务https://www.cnblogs.com/hzmark/p/rocket_txn.html 参考:rabbitMQ.activeMQ.zeroMQ.Kafka ...

  10. Deep Learning Terminologies

    Deep Learning Terminologies batch full batch 已知在梯度下降中,需要对所有样本进行处理过后然后走一步(梯度更新),那么如果我们的样本规模的特别大的话效率就会 ...