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

java-设计模式(结构型)-【代理模式】相关推荐

  1. [设计模式-结构型]代理模式(Proxy)

    概括 名称 Proxy 结构 动机 为其他对象提供一种代理以控制对这个对象的访问. 适用性 在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用P r o x y 模式.下面是一 些可以使用P ...

  2. Java设计模式-结构型-门面模式

    目录 前言 示例 前言 门面模式(也叫外观模式,Facade Pattern)在许多源码中有使用,比如 slf4j 就可以理解为是门面模式的应用.这是一个简单的设计模式,我们直接上代码再说吧. 示例 ...

  3. JAVA设计模式(09):结构型-代理模式(Proxy)

    代理模式是经常使用的结构型设计模式之中的一个,当无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接 ...

  4. JAVA设计模式--结构型模式--代理模式

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

  5. JAVA设计模式--结构型模式

    2019独角兽企业重金招聘Python工程师标准>>> 我们接着讨论设计模式,上篇文章我讲完了5种创建型模式,这章开始,我将讲下7种结构型模式:适配器模式.装饰模式.代理模式.外观模 ...

  6. 23种java设计模式详解-代理模式

    什么是代理模式: Proxy模式又叫做代理模式,是构造型的设计模式之一,它可以为其他对象提供一种代理(Proxy)以控制对这个对象的访问.所谓代理,是指具有与代理元(被代理的对象)具有相同的接口的类, ...

  7. Java设计模式之虚拟代理模式

    描述: 虚拟代理模式(Virtual Proxy)是一种节省内存的技术,它建议创建那些占用大量内存或处理复杂的对象时,把创建这类对象推迟到使用它的时候.在特定的应用中,不同部分的功能由不同的对象组成, ...

  8. JAVA 设计模式之《代理模式》

    文章目录 一.代理模式介绍 二.静态代理 三.jdk 动态代理 四.cglib 动态代理 五.总结 一.代理模式介绍 代理模式,非常容易理解,一眼看过去大家都懂,字面意思,如果不懂稍微琢磨琢磨就懂了, ...

  9. Java设计模式——结构型模式之享元模式

    文章目录 7 享元模式*** 7.1 概述 7.2 结构 7.3 案例实现 7.5 优缺点和使用场景 7.6 JDK源码解析 7 享元模式*** 7.1 概述 定义: ​ 运用共享技术来有效地支持大量 ...

  10. GOF设计模式之外观模式(结构型代理模式)

最新文章

  1. SpringCloud确保服务只能通过gateway转发访问,禁止直接调用接口访问
  2. 人生不能过分认真(较真),但必须认真!
  3. 2台服务器虚拟存储,虚拟存储的主要用途
  4. 面向连接的套接字通信工作流程
  5. DocumentFragment使用
  6. bean validation校验方法参数_Spring Boot 之使用 validation 验证参数
  7. Linux的远程连接及Linux系统下Tomcat部署
  8. HDU - 3790 最短路径问题
  9. 软件工程测试旅游管理系统,旅游管理系统的设计与实现
  10. eclipse不识别java,在Eclipse中运行的Maven项目存在问题,无法识别为Java项目
  11. 2021-09-07912. 排序数组
  12. 【深度长文】中国电子商务简史:1999-2019
  13. 服务器怎么格式化系统盘,如何格式化服务器
  14. TSL1401 CCD传感器驱动
  15. PHP解压zip文件,并且读取文件内容输出
  16. 计算机 先进事迹范文,计算机,先进事迹范文.doc
  17. 数学建模 —— 规划模型
  18. 2020.12.10丨cufflinks 简介及使用说明
  19. VMWare安装Win10虚拟机
  20. 获取枚举常量的描述值Description

热门文章

  1. ASP.NET下QueryString不同字符编码间强制转换的解决方案
  2. shell基础(上)
  3. VMware Horizon虚拟桌面工具箱2.0-审计,远程协助,控制台,电源
  4. Visual Studio Code 前端调试不完全指南
  5. Android中的数据库
  6. 实现每个点赞用户点击的带属性的字符串
  7. Linux文件、目录权限及常用命令
  8. FLEX组件AnyChart实例教程.
  9. java中如何做模糊查询_到底Java里的模糊查询语句该怎么写
  10. webgl获取鼠标形状_三模无线搭配对称手型设计,游戏致胜利器,ROG烈刃2无线鼠标...