java-设计模式(结构型)-【代理模式】

1.代理模式(ProxyMode)

  定义:外观模式是对类与类之间关系的描述,而代理模式是对原来的方法添加其他的操作

          代理有“网关”的含义,比如用户访问论坛,则要经过代理(网关)授权给你才能访问,即

          游客和注册用户的权限不同。

          比如说你要去买房子,而买房子的过程包括:1.看房->2.谈价->3.签订合约->4.正式入手(买房)->5.入住。

          而代理类就是对步骤4操作添加其他操作,而这些操作都由代理类帮你完成。简化了你的买房过程。

  总结:对于某些“远程”(难以完成的)操作,为了能快速完成,此时可以借助代理类帮我们完成部分操作。

           比如远程访问一张大图时,由于网络原因不知何时回返回过来,可以通过代理类先提前返回一个缩略图

  使用场景:

    (1)远程代理。典型的就是客户端与webservice使用的情况,客户端由于是针对OOP编程,而不是针对webservice中的方法进行编程,

           所以得在客户端模拟一下webservice的环境,用proxy来对webservice进行包装,这样就可以使用proxy代理类来远程操作webservice了。

    (2)虚拟代理。比如你要开发一个大文档查看软件,大文档中有大的图片,有可能一个图片有100MB,在打开文件时不可能将所有的图片都显示出来,

           这样就可以使用代理模式,当需要查看图片时,用proxy来进行大图片的打开。

    (3)安全代理。其实也就是本例中所举的买车的例子,金钱不够不可以买车!

    (4)智能指引。比如在访问一个对象时检测其是否被锁定等情况。

              对已有的方法进行改进,此时有两种办法:

                1、修改原有的方法来适应。这样违反了“对扩展开放,对修改关闭”的原则。

                2、就是采用一个代理类调用原有的方法,且对产生的结果进行控制。这种方法就是代理模式。

                     使用代理模式,可以将功能划分的更加清晰,有助于后期维护!

2.图解

  2.1 共同的接口方法

//买车接口
public interface BuyCar {//买车的行为void buyCar();
}

 2.2 实现接口的人类

//人类:具有现金,名字属性,具有买车行为的接口。
public class People implements BuyCar {private int cash;private String username;//买车行为@Overridepublic void buyCar() {// TODO Auto-generated method stubSystem.out.println(this.username+"买了一辆小车");}public int getCash() {return cash;}public void setCash(int cash) {this.cash = cash;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}
}

  2.3 实现接口的代理类

//安全代理类
//人买车代理类:具有“人”成员,具有买房接口的方法
public class ProxyPeople implements BuyCar {private People p=null;private String proxyname=null;public ProxyPeople(String proxyname){this.proxyname=proxyname;}//对于人买车的行为进行安全代理@Overridepublic void buyCar() {if(p==null){System.out.println("没人来买车,"+this.proxyname+"继续等待客户光临");return ;}System.out.println(proxyname+"在陪"+p.getUsername()+"客户买车。。。");//符合条件则可以买车。if(p.getCash()>10000){//代理之前的操作。。。System.out.println(this.proxyname+":"+p.getUsername()+"有"+p.getCash()+"元,你可以买10000以上的小车");p.buyCar();//代理之后的操作。。。System.out.println(this.proxyname+"成功代理"+p.getUsername()+"买了一辆车");}elseSystem.out.println(this.proxyname+":"+p.getUsername()+"有"+p.getCash()+"元,低于10000,无法买车");}public People getP() {return p;}public void setP(People p) {if(p!=null)System.out.println(p.getUsername()+"先生/女士,来买车了。。。");this.p = p;}
}

  2.4 测试

public class Test {public static void main(String[] args) {// TODO Auto-generated method stubPeople p=new People();p.setCash(12000);p.setUsername("黄生");ProxyPeople proxy=new ProxyPeople("A车代理");proxy.setP(p);proxy.buyCar();p.setCash(5000);proxy.buyCar();proxy.setP(null);proxy.buyCar();}
}

  2.5 运行结果

黄生先生/女士,来买车了。。。
A车代理在陪黄生客户买车。。。
A车代理:黄生有12000元,你可以买10000以上的小车
黄生买了一辆小车
A车代理成功代理黄生买了一辆车
A车代理在陪黄生客户买车。。。
A车代理:黄生有5000元,低于10000,无法买车
没人来买车,A车代理继续等待客户光临

  

  

转载于:https://www.cnblogs.com/beyondbycyx/p/4425164.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472111.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql建表_128、mysql建表和简单sql

EMPLOYEES, 有四个字段,EMPLOYEE_ID:员工表(主键)、DEPT_ID:部门号、EMPLOYEE_NAME:员工姓名、EMPLOYEE_SALARY:员工工资。建表语句CREATE TABLE EMPLOYEES(EMPLOYEE_ID int not null primary key,DEPT_ID int,EMPLOYEE_NAME char(40),EMPLOYEE_SALARY double);检索…

LeetCode 1893. 检查是否区域内所有整数都被覆盖(差分)

文章目录1. 题目2. 解题1. 题目 给你一个二维整数数组 ranges 和两个整数 left 和 right 。每个 ranges[i] [starti, endi] 表示一个从 starti 到 endi 的 闭区间 。 如果闭区间 [left, right] 内每个整数都被 ranges 中 至少一个 区间覆盖,那么请你返回 true &a…

Log4j乱码

在log4j.properties里添加encoding , 例如 : log4j.appender.fuscentorg.apache.log4j.DailyRollingFileAppender log4j.appender.fuscent.encodingUTF-8 log4j.appender.fuscent.File/Users/kane/Work/log/core/fuscent.log log4j.appender.fuscent.layoutorg.apache.log4j.P…

mysql的where字句调优_mysql中select和where子句优化的总结

本篇文章给大家带来的内容是关于mysql中select和where子句优化的总结,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。数据库优化:1.可以在单个SQL语句,整个应用程序,单个数据库服务器或多个联网数据库…

数据中台建设与应用_Gartner对于建设数据中台的建议

(文:Gartner高级研究总监 孙鑫)数据中台是中国本土诞生的一个名词,很多企业在“什么是数据中台”和“我要上XX中台”徘徊。其炒作程度跟当年的“大数据” 一词有的一拼,如果用Gartner的炒作周期图来看,数据中台目前已经逼近炒作的…

LeetCode 1894. 找到需要补充粉笔的学生编号

文章目录1. 题目2. 解题1. 题目 一个班级里有 n 个学生,编号为 0 到 n - 1 。 每个学生会依次回答问题,编号为 0 的学生先回答,然后是编号为 1 的学生,以此类推,直到编号为 n - 1 的学生,然后老师会重复这…

C# Excel处理工具

需求:选择一个Excel文件,然后对该Excel文件进行处理,再导出一个处理后的Excel文件。 效果图 声明:我对winform开发不熟,但是我看到许多开发人员做东西只管交差,从不考虑用户体验,也不考虑容错处…

mysql 坚向变横向_(排班表一)使用SQL语句使数据从坚向排列转化成横向排列

知识重点:1.extract(day from schedule01::timestamp)13Extract 属于 SQL 的 DML(即数据库管理语言)函数,同样,InterBase 也支持 Extract,它主要用于从一个日期或时间型的字段内抽取年、月、日、时、分、秒数据,因此&a…

python增加子类的参数_python 子类向父类传递关键字参数

父类构造函数class SoapClient(object):"""Simple SOAP Client (simil PHP)"""def __init__(self, locationNone, actionNone, namespace,certNone, proxyNone, nsNone,soap_nsNone, wsdlNone, wsdl_basedir, ca_certsNone,sessionsFalse, soap_…

LeetCode 1897. 重新分配字符使所有字符串都相等

文章目录1. 题目2. 解题1. 题目 给你一个字符串数组 words(下标 从 0 开始 计数)。 在一步操作中,需先选出两个 不同 下标 i 和 j,其中 words[i] 是一个非空字符串,接着将 words[i] 中的 任一 字符移动到 words[j] 中…

2015/4/14课堂练习

1.设计题目 书店针对《哈利波特》系列书籍进行促销活动,一共5卷,用编号0、1、2、3、4表示,单独一卷售价8元, 具体折扣如下所示: 本     数量 折扣 …

python 图片背景前景分离_【绝了】用 Python 把朋友头像变表情包!

正文在日常生活中,我们经常会存取一些朋友们的丑照,在这个项目中,我们以萌萌哒的熊猫头作为背景,然后试着在背景图上加入朋友们的照片,效果如下图所示。实现步骤导入朋友的照片(前景照片);处理前景照片(缩放…

LeetCode 1899. 合并若干三元组以形成目标三元组

文章目录1. 题目2. 解题1. 题目 三元组 是一个由三个整数组成的数组。 给你一个二维整数数组 triplets ,其中 triplets[i] [ai, bi, ci] 表示第 i 个 三元组 。 同时,给你一个整数数组 target [x, y, z] ,表示你想要得到的 三元组 。 为了…

mysql snowflake_雪花算法-snowflake

雪花算法-snowflake分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID&a…

nrf52832芯片手册_nRF52832低功耗问题不完全总结

0.前言技术和经历经验都有限,以下内容仅供初学者参考和个人总结记录,不定期更新。都是使能协议栈开启BLE广播的情况协议栈:s132_nrf52_6.1.1SDK:nRF5_SDK_15.3.0_59ac3451.进入低功耗方式nRF52832进入低功耗或保持低功耗方式比较简…

openpyxl 读写 excel

import openpyxl book openpyxl.load_workbook(b.xlsx) # 读取 # sheet book["name_tab"] sheet book.active # rowsheet.max_row # 行数 columnsheet.max_column # 列数 print(row) print(column) for r in range(2, row1): # 跳过表头,行号是从1开…

iOS开发周报-- 第一期

从Java转iOS第一个项目总结 http://www.cocoachina.com/ios/20150417/11595.html icon设计探讨:图标,文字,还是图标加文字? http://www.cocoachina.com/design/20150414/11552.html 为什么整个互联网行业都缺CTO http://www.cocoa…

mysql 连接 内存溢出_mysql - MySQL中止连接未知错误 - 堆栈内存溢出

我使用多jdbc执行全表查询以进行数据迁移。 当我使用并行的75个jdbc查询每个表有近3000000行的差异表时,我发现MySQL在所有数据返回到jdbc之前中止了一个连接。慢日志:Time: 160919 9:09:38UserHost: test[test] [10.142.90.20]Thread_id: 349 Schema: …

opengl计算帧率_或许是迄今为止第一篇讲解 fps 计算原理的文章吧

前言fps,是 frames per second 的简称,也就是我们常说的“帧率”。在游戏领域中,fps 作为衡量游戏性能的基础指标,对于游戏开发和手机 vendor 厂商都是非常重要的数据,而计算游戏的 fps 也成为日常测试的基本需求。目前…

041、基于CNN的样式迁移

之——基于CNN的滤镜 目录 之——基于CNN的滤镜 杂谈 正文 1.基于CNN的样式迁移 2.实现 杂谈 通过CNN的特征提取,可以实现将一个图片的样式模式特征迁移到另一张图像上。 正文 1.基于CNN的样式迁移 就是在某些层的输出上用其他的图片进行监督。 2.实现 一般来…