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…

数据中台建设与应用_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…

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] ,表示你想要得到的 三元组 。 为了…

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开…

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

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

041、基于CNN的样式迁移

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

LeetCode 483. 最小好进制(二分查找)

文章目录1. 题目2. 解题1. 题目 对于给定的整数 n, 如果 n 的 k(k>2)进制数的所有数位全为1,则称 k(k>2)是 n 的一个好进制。 以字符串的形式给出 n, 以字符串的形式返回 n 的 最小 好进制。 示例 1&#xff…

LeetCode LCS 01. 下载插件

文章目录1. 题目2. 解题1. 题目 小扣打算给自己的 VS code 安装使用插件,初始状态下带宽每分钟可以完成 1 个插件的下载。 假定每分钟选择以下两种策略之一: 使用当前带宽下载插件将带宽加倍(下载插件数量随之加倍) 请返回小扣完成下载 n …

LeetCode LCS 02. 完成一半题目(计数+排序)

文章目录1. 题目2. 解题1. 题目 有 N 位扣友参加了微软与力扣举办了「以扣会友」线下活动。 主办方提供了 2*N 道题目,整型数组 questions 中每个数字对应了每道题目所涉及的知识点类型。 若每位扣友选择不同的一题,请返回被选的 N 道题目至少包含多少种…

摄像头图像分析目标物体大小位置_单个运动摄像头估计运动物体深度,谷歌挑战新难题...

雷锋网 AI 科技评论按:人类视觉系统有一个我们习以为然但其实极其强大的功能,那就是可以从平面图像反推出对应的三维世界的样子。即便在有多个物体同时移动的复杂环境中,人类也能够对这些物体的几何形状、深度关系做出合理的推测。然而类似的…

LeetCode LCS 03. 主题空间(广度优先搜索BFS)

文章目录1. 题目2. 解题1. 题目 「以扣会友」线下活动所在场地由若干主题空间与走廊组成,场地的地图记作由一维字符串型数组 grid,字符串中仅包含 “0"~"5” 这 6 个字符。 地图上每一个字符代表面积为 1 的区域,其中 …

SQL SERVER PIVOT 行转列、列传行

在数据库操作中,有些时候我们遇到需要实现“行转列”的需求,例如一下的表为某店铺的一周收入情况表: WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIMAL) 我们先插入一些模拟数据: INSERT INTO WEEK_INCOME SELECT 星期一,1000 UNION…

mysql cluster 查看数据库表名称_MySQL Cluster如何创建磁盘表方法解读

MySQL Cluster采用一系列的Disk Data objects来实现磁盘表;接下来为您详细介绍一、概念MySQL Cluster采用一系列的Disk Data objects来实现磁盘表。Tablespaces:作用是作为其他Disk Data objects的容器。Undo log files:存储事务进行回滚需要的信息&…