Java 设计模式 代理模式
https://blog.csdn.net/luanlouis/article/details/18847313
https://blog.csdn.net/luanlouis/article/details/24589193
Proxy (代理模式)定义
- Purpose (目的)
- Structure (结构)
- Applications (应用)
- Consequences (结论)
Purpose (目的)
- 为另外一个对象提供一个代理或占位符以控制对这个对象的访问。
Structure (结构)
- Proxy角色
- (该角色)持有一个RealSubject 角色的引用,用以访问RealSubject。如果RealSubject和Subject角色的接口是相同的,Proxy角色也可以持有一个Subject的引用(不过这个Subject 还是引用的是RealSubject的实现,即父类引用子类对象 :Subject subject=new RealSubject())。
- 应该具有和Subject角色完全一致的接口,这样,Proxy角色可以成为RealSubject 的替代品。
- 控制对 真正对象访问,并且可以负责创建和删除真正对象。
- 其他功能:
- 远程代理负责加密请求和参数,然后将加密的请求发送到不同的地址空间的真正对象。
- 为真正的对象提供额外的信息。
- 保护性质的代理可以为 访问 realSubject请求提供权限控制。
- Subject : 定义RealSubject和Proxy实现的公共接口。
- RealSubject : 定义代理要表示的真正的对象。
Applications(应用)
- 一个远程的代理对不同的地址空间内的对象提供一个本地表示。
- 可以根据需求控制创建代价昂贵的对象。
- 为原对象提供访问权限的控制。
Consequences(结论)
- 代理模式 引入了非直接访问对象的机制 。这种添加的非直接访问,有以下几种应用:
- 一个远程的代理对不同的地址空间内的对象提供一个本地表示
- 一个虚拟的代理可以优化功能,比如根据需求创建对象。
- 保护性代理允许当访问对象时,做一些额外的内部操作。
代理模式应用示例
- 想要访问某对象,但是不能直接访问某对象场景--车票代售点
- 为访问对象增加权限控制--用户信息检索系统
- 增强原对象功能--AOP
想要访问某对象,但是不能直接访问某对象场景--车票代售点
车站设置代售点的原因,一方面是为人流高峰期缓解车站自身压力,另一方面则是对一些偏远地方,购票很不方便的人提供便利。
车站的售票业务主要有:卖票、问询、退票,将其抽象出一个接口TicketService,将功能分别定义为:sellTicket(),inquire()和withdraw()。将车站定义为Station类,实现TicketService接口;而代售点定义为StationProxy,实现TicketService接口,并持有一个Station实例的引用,三个角色之间的关系如下图:
相关代码如下:
- package com.foo.proxy;
- /**
- * 售票服务接口
- * @author louluan
- */
- public interface TicketService {
- //售票
- public void sellTicket();
- //问询
- public void inquire();
- //退票
- public void withdraw();
- }
- package com.foo.proxy;
- /**
- * 售票服务接口实现类,车站
- * @author louluan
- */
- public class Station implements TicketService {
- @Override
- public void sellTicket() {
- System.out.println("\n\t售票.....\n");
- }
- @Override
- public void inquire() {
- System.out.println("\n\t问询。。。。\n");
- }
- @Override
- public void withdraw() {
- System.out.println("\n\t退票......\n");
- }
- }
- package com.foo.proxy;
- /**
- * 车票代售点
- * @author louluan
- *
- */
- public class StationProxy implements TicketService {
- private Station station;
- public StationProxy(Station station){
- this.station = station;
- }
- @Override
- public void sellTicket() {
- // 1.做真正业务前,提示信息
- this.showAlertInfo("××××您正在使用车票代售点进行购票,每张票将会收取5元手续费!××××");
- // 2.调用真实业务逻辑
- station.sellTicket();
- // 3.后处理
- this.takeHandlingFee();
- this.showAlertInfo("××××欢迎您的光临,再见!××××");
- }
- @Override
- public void inquire() {
- // 1做真正业务前,提示信息
- this.showAlertInfo("××××欢迎光临本代售点,问询服务不会收取任何费用,本问询信息仅供参考,具体信息以车站真实数据为准!××××");
- // 2.调用真实逻辑
- station.inquire();
- // 3。后处理
- this.showAlertInfo("××××欢迎您的光临,再见!××××");
- }
- @Override
- public void withdraw() {
- // 1。真正业务前处理
- this.showAlertInfo("××××欢迎光临本代售点,退票除了扣除票额的20%外,本代理处额外加收2元手续费!××××");
- // 2.调用真正业务逻辑
- station.withdraw();
- // 3.后处理
- this.takeHandlingFee();
- }
- /*
- * 展示额外信息
- */
- private void showAlertInfo(String info) {
- System.out.println(info);
- }
- /*
- * 收取手续费
- */
- private void takeHandlingFee() {
- System.out.println("收取手续费,打印发票。。。。。");
- }
- }
- package com.foo.proxy;
- /**
- * 客户端角色
- * @author louluan
- */
- public class Client {
- public static void main(String[] args) {
- //创建Station
- Station service = new Station();
- //创建代理类
- StationProxy proxy = new StationProxy(service);
- //代售点售票
- proxy.sellTicket();
- }
- }
执行结果:
为访问对象增加权限-用户信息检索系统
公司有一个用户信息检索系统,管理员可以检索用户的基本信息,教育背景,和账户信息。由于业务发展的需要,此系统要跟公司实现信息共享,需要向别的公司提供我们的接口,但是信息共享并不是全部共享,只允许别的公司查询基本信息和教育背景,而有些敏感信息账户信息不允许别的公司调用的,在这里可以设置一个代理,用于控制访问查询信息接口的权限控制,当是外部想要查询账户信息时,给你返回 "********"掩码展示。
定义一个UserInfoService接口,有getBasicInfo(),getEducationalBackground(),getAcccountInfo()分别用于查询基本信息,教育背景,账户信息;
UserInfoServiceImpl类实现UserInfoService接口;
UserInfoServiceProxy类作为代理类,实现UserInfoService接口和持有一个UserInfoServiceImpl引用:
- package com.foo.proxy1;
- /**
- * 信息查询接口
- */
- public interface UserInfoService {
- //基本信息
- public String getBasicInfo();
- //教育背景
- public String getEducationalBackground();
- //账户信息
- public String getAcccountInfo();
- }
- package com.foo.proxy1;
- /**
- * 查询接口实现
- * @author louluan
- */
- public class UserInfoServiceImpl implements UserInfoService {
- @Override
- public String getBasicInfo() {
- return "Basic Info....";
- }
- @Override
- public String getEducationalBackground() {
- return "Educational Background.....";
- }
- @Override
- public String getAcccountInfo() {
- return "Account Info.....";
- }
- }
- package com.foo.proxy1;
- /**
- * 信息查询代理控制访问权限
- * @author louluan
- */
- public class UserInfoServiceProxy implements UserInfoService {
- private UserInfoService impl;
- private String role;
- public UserInfoServiceProxy(UserInfoService impl,String role)
- {
- this.impl = impl;
- this.role = role;
- }
- @Override
- public String getBasicInfo() {
- return impl.getBasicInfo();
- }
- @Override
- public String getEducationalBackground() {
- return impl.getEducationalBackground();
- }
- @Override
- public String getAcccountInfo() {
- //如果是公司本部,返回
- if("1".equals(role))
- {
- return impl.getAcccountInfo();
- }
- //禁止访问impl方法,返回****
- return "**********";
- }
- }
- package com.foo.proxy1;
- public class Client {
- public static String OUT="0";
- public static String IN="0";
- public static void main(String[] args) {
- UserInfoService service = new UserInfoServiceImpl();
- UserInfoServiceProxy proxy = new UserInfoServiceProxy(service,OUT);
- //外部公司查询信息
- System.out.println("*****外部公司查询信息*******");
- //获取基本信息:
- String basicInfo = proxy.getBasicInfo();
- System.out.println("基本信息:"+basicInfo);
- //教育背景
- String educationalBackground = proxy.getEducationalBackground();
- System.out.println("教育背景:"+educationalBackground);
- //账户信息
- String accountInfo = proxy.getAcccountInfo();
- System.out.println("账户信息:"+accountInfo);
- }
- }
增强原对象的功能---AOP
代理模式最有魅力的地方就在于它实现了AOP(Aspect-Oriented Programming),即面向切面的编程。
Java 设计模式 代理模式相关推荐
- java设计模式代理模式_Java中的代理设计模式
java设计模式代理模式 代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它 ...
- Java设计模式(代理模式-模板方法模式-命令模式)
Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...
- Java设计模式-代理模式笔记
代理模式 0 什么是代理模式 理解方式1 理解方式2 1 静态代理 1.1 代码实现 1.2 方法解读 1.3 优缺点 2 动态代理 2.1 具体实现 2.2 方法解读 2.3 注意 3 Cglib代 ...
- 通俗易懂说java设计模式-代理模式
基本概念 代理模式,和我们在生活中所理解的"代理"思想并没有太大的区别.代理模式的实现需要我们设计一个代理类,在不直接访问被代理对象的前提下,通过代理类实现对被代理对象的间接访问, ...
- JAVA设计模式--代理模式(静态)
目录 一.什么是代理模式 二.静态代理模式的结构 三.静态代理模式应用举例 应用一 应用二 四.代理模式的应用场景 五.静态代理模式的特点 一.什么是代理模式 代理(Proxy)模式为其他对象提供一种 ...
- Java设计模式—代理模式
1. 什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2. 代理模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标 ...
- java设计模式-代理模式初探
根据圣思园的视频,整理的java代理模式. 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间 ...
- JAVA设计模式 - 代理模式
在对象的一个业务方法完成之后, 有时候我们可能需要去添加一些新的功能(前置校验等). 但我们又不想更改原来的代码 , 代理模式就为我们提供了一种解决方案 . 1 . 代理模式的定义 代理模式就是在不改 ...
- Java设计模式——代理模式
文章目录 1.简介 2.推荐实现案例 3.优缺点 3.1 优点 3.2 缺点 4.应用场景 5.注意事项 6.拓展 6.1 普通代理 6.2 强制代理 6.3 代理类的个性 6.4 动态代理 7.最佳 ...
- Java设计模式--代理模式
1. 代理模式的引入 王大爷借了小李1.5亿,小赖是个无赖横竖就是不还钱,王大爷身子弱讨不回钱就请了讨债公司的小强,最后小强通过一系列**(过于残暴被打码了)的手段帮助王大爷讨回欠款.完事后还帮王大爷 ...
最新文章
- presto能连接mysql和hive吗_Presto连接Hive
- eclipse集成lombok
- 边缘计算 — 起源与定义
- 如何知道刚刚插入数据库那条数据的id
- 理论+实践轻松掌握nohup java -jar xxxx.jar /dev/null 21 意义
- Codeforces 1106F Lunar New Year and a Recursive Sequence (线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...
- Spring 核心特性
- 开学一月,可以自己玩自己做的游戏了!!!
- PPP认证方式pap chap chap2
- win2008 php mysql zend phpmyadmin_Windows2008 最新版Apache2.PHP5.MySQL6.PHPMyadmin.ZendOptimizer安装图解...
- c语言24点游戏代码回法,C语言解24点游戏程序
- 浅复制和深复制的区别?//浅拷贝和深拷贝
- 驳《寒门再难出贵子》——谁说寒门大学生没有春天!
- 计算机主板 g41,g41主板bios设置方法
- Linux:struct dirent
- c++输出字符串结尾部分中文乱码问题
- 安装CloudReady,体验Chrome OS
- 铁路订票系统的简单设计
- android 蓝牙耳机 找不到驱动程序,bluetooth外围设备找不到驱动程序现象的解决方法介绍...
- MongoDB 存放图片