代理模式定义:

为其他对象提供一种代理以控制对这个对象的访问。在面向对象中,有时候直接访问一些对象比较麻烦,所以代理模式就是在这个对象上加上一个访问该对象的访问层。类似于很多明星的事务实际都是交给经纪人处理的。

UML图:

角色分工:

  • 抽象主题角色:定义了被代理角色和代理角色的共同接口或者抽象类。
  • 被代理角色:实现或者继承抽象主题角色,定义实现具体业务逻辑的实现。
  • 代理角色:实现或者继承抽象主题角色,持有被代理角色的引用,控制和限制被代理角色的实现,并且拥有自己的处理方法(预处理和善后)

优/缺点:

优点:

1.职责清晰。

2.高扩展性。

3.智能化。

缺点:

1.由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。

2.实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

应用场景:

1.远程代理。

2.虚拟代理。

3.Copy-on-Write 代理

在java中的应用:spring-aop实现,Mybatis 都有使用代理模式。

微剧场:

自从韩数荣登荣耀钻石宝座之后,前来拜师学艺的人络绎不绝,直接拉动了当地酒店行业的发展。

刚开始的时候还好,人毕竟来的不多,韩数把每个客人都安排妥当之后,仍然可以留一些时间去专注在自己的王者事业上,可是好久不长,奈何韩数王者技艺高超,方圆十里几乎无人不晓,渐渐地,找韩数的人越来越多,韩数不得不将大量的时间花在接待慕名前来的人们,导致自己在王者上投入的时间愈来愈少,韩数想长此以往下去,自己都没有时间打王者提升技艺了?核心竞争力一旦没有的话,那我岂不是要成为过气网红了?不能这样不能这样,我不要成为下一个乔碧萝。不!!!!

听说经纪公司给每一个明星都安排了一个经纪人,既然他们可以有的话,那么我为什么不能也雇一个呢?于是把阿呆叫过来做自己的经纪人。

每当有新的小迷妹过来拜访(咳咳,想什么呢?),阿呆负责把他们的生活起居安排好,包括酒店的预订,重要事情的通知等,当他们需要和韩数大神交流时直接通知韩数就行了。这样一来,韩数挤出来很多空闲的时间去提升自己的王者技巧,向无敌至上牛x轰轰荣耀王者的小目标又迈进了一步。

代码实战:

首先呢,我们声明一个明星接口,star,用来规范子类的行为。

public interface Star {//声明韩数与其他们交流王者上分技巧的方法public void exchange();
}

然后声明我们的具体实现HStar ,并实现Star接口,作为代表韩数的类。

public class HStar implements Star {
​@Overridepublic void exchange() {System.out.println("巴拉巴拉嘤嘤嘤交流中....");}
​
}

同时我们创建一个代理类ProxyStar并实现Star接口,作为我们的经纪人角色。

public class ProxyStar implements Star{private HStar star;
​@Overridepublic void exchange() {if(star == null) {star = new HStar();}System.out.println("经纪人安排访客住宿,吃饭等等等等,通知韩数接待客人");star.exchange(); }
​
}

测试:

public class Test {public static void main(String[] args) {Star star = new ProxyStar();star.exchange();}
​
}
​

输出:

经纪人安排访客住宿,吃饭等等等等,通知韩数接待客人
巴拉巴拉嘤嘤嘤交流中....

不对,等等,好像哪里不对,我想想,就是那个,那个,就是…

你是不是想说怎么看着那么像装饰者设计模式呢?其实呢,本例用装饰者模式实现的话代码其实是几乎一样的。

那,那他为什么叫代理模式呢?这不是挂羊头卖狗肉吗?还是之前计划的设计模式,发现凑不齐,硬加上去的?

当然不是这样,装饰者设计模式和代理模式虽然很相似,但是侧重点却不一样,下面让我们来看看他们的异同吧。

相同点:

  • 都需要实现同一个接口或者继承同一个抽象类,并且代理角色和装饰角色都持有被代理角色和构件角色的引用。
  • 两者都可以在被代理角色的业务方法前或者后添加额外的处理逻辑。

不同点:

  • 装饰器模式为了增强功能,而代理模式是为了加以控制。

大家可以把代理模式和装饰者模式看作是双胞胎两兄弟,只是发展侧重的点不一样,一个是侧重于对类功能上的增强,另一个则是侧重于对类的控制,正如我们前面所看到的,代理模式对于对象的操作几乎都是由代理对象来操作的。

总结

代理模式分为动态代理和静态代理两种,本文所使用的代理模式均为静态代理,动态代理将作为本文的番外篇另作讲解。
我是小架,我们下篇文章再见!

Java中的设计模式:“代理模式”的理解相关推荐

  1. [Head First设计模式]餐馆中的设计模式——命令模式

    系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式- ...

  2. java设计模式代理模式_Java中的代理设计模式

    java设计模式代理模式 代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它 ...

  3. Java设计模式(代理模式-模板方法模式-命令模式)

    Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...

  4. JAVA设计模式--代理模式(静态)

    目录 一.什么是代理模式 二.静态代理模式的结构 三.静态代理模式应用举例 应用一 应用二 四.代理模式的应用场景 五.静态代理模式的特点 一.什么是代理模式 代理(Proxy)模式为其他对象提供一种 ...

  5. 大话设计模式-代理模式(大鸟和小菜Java版)

    代理模式:在代理模式(Proxy Pattern)中,一个类代表另一个类的功能.这种类型的设计模式属于结构型模式. 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口. 以上就是代理模式 ...

  6. 一起学设计模式 - 代理模式

    理模式(ProxyPattern)属于 结构型模式的一种,给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象. 概述 身处华夏大地的 ...

  7. Java的三种代理模式简述

    本文着重讲述三种代理模式在java代码中如何写出,为保证文章的针对性,暂且不讨论底层实现原理,具体的原理将在下一篇博文中讲述. 代理模式是什么 代理模式是一种设计模式,简单说即是在不改变源码的情况下, ...

  8. Android常见设计模式——代理模式(Proxy Pattern)

    文章目录 1. 前言 2. 代理模式(Proxy Pattern) 2.1 静态代理模式 2.2 动态代理模式 3. Android 中的代理模式 3.1 Retrofit中的代理模式(没有被代理者) ...

  9. Java 中的设计模式

    1.设计模式概念 1.1 什么地方可以用到设计模式 面向对象(OO)=>功能模块[设计模式+算法(数据结构)]=>框架[使用多种设计模式]=>架构[服务器集群] 复制代码 1.2 使 ...

  10. Java的三种代理模式完整源码分析

    Java的三种代理模式&完整源码分析 Java的三种代理模式&完整源码分析 参考资料: 博客园-Java的三种代理模式 简书-JDK动态代理-超详细源码分析 [博客园-WeakCach ...

最新文章

  1. ZKFC服务异常:Parent znode does not exist.
  2. 【转载】Linux系统与性能监控
  3. 从算法+数据结构到MVC
  4. Luogu2791 幼儿园篮球题【斯特林数,数学】
  5. Py之pandas:pandas的read_excel()函数中各参数说明及函数使用方法讲解
  6. Memcache 内存分配策略和性能(使用)状态检查
  7. VTK:IO之GLTFExporter
  8. 新闻发布项目——接口类(categoryTBDao)
  9. 机器学习:最大似然估计与最大后验概率估计
  10. 基于JAVA+SpringBoot+Mybatis+MYSQL的科研项目评审系统
  11. 修改docker内mysql配置后无法启动解决方法
  12. linux下安装配置laravel环境,linux下的laravel安装
  13. 解决ichat模块调用过程中——登录微信网页版失败的方法
  14. 布谷鸟算法的程序(个人注释)
  15. dom影像图形成数字地形图_航测相关知识点——鲲鹏智汇承接航测相关任务
  16. 基础——内部RC振荡电路、外部晶振、RCC、RTC
  17. Python学习(52周存钱)
  18. APP开发流程都有哪些?
  19. 计算机想ping一下网络,Ping命令以检测Windows7下的计算机网络速度
  20. c/c++ 实现推箱子小游戏

热门文章

  1. 基于QT实现的机场的起飞和着陆管理模拟系统
  2. 阿里云音乐趋势预测初赛、复赛数据集下载
  3. 有关软件测试的问答(转)
  4. 结绳法:文章详细解读(异步时钟设计的同步策略)(五)
  5. 学会Python数据分析(建模)--基础篇1
  6. LoRaWAN模块在车辆跟踪定位中的应用
  7. 反爬虫①---浏览器断点调试
  8. Linux C/C++编程之(十)动态库的制作和使用
  9. Nacos与达梦数据库的适配
  10. 论文解读- nnU-Net: Self-adapting Framework for U-Net-Based Medical Image Segmentation(附实现教程)