1.定义

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
简单来说:代理模式为其他对象提供一种代理以控制对这个对象的访问。

2.概述

当用户希望和某个对象打交道,但程序可能不希望用户直接访问该对象,而是提供一个特殊的对象,这个特殊的对象被称作当前用户要访问对象的代理,程序让用用户和对象的代理打交道,即让用户通过访问代理来访问想要访问的对象。在代理模式中,代理的特点是:它与所代理的对象实现了相同的接口,也就是说代理和它所代理的对象向用户公开了相同的方法,当用户请求代理调用这样的方法时,代理可能需要验证某些信息或检查它所代理的对象是否可用,当代理确认它所代理的对象能够电泳相同的方法时,就把实际的方法调用委派给它所代理的对象,即让所代理的对象调用同样的方法。
例如: 秘书是老板的代理,老板个秘书都有接听电话的方法:herePhone();
公司要求用户必须首先和秘书通电话才能和老板通电话,也就是说,用户必须首先请求秘书调用herePhone方法,当秘书确认老板可以接听电话时,就将用户的实际请求委派给老板,即让老板调用herePhone方法,如下所示:

3.应用场景

1、远程代理。
2、虚拟代理。
3、Copy-on-Write 代理。
4、保护(Protect or Access)代理。
5、Cache代理。
6、防火墙(Firewall)代理。
7、同步化(Synchronization)代理。
8、智能引用(Smart Reference)代理。

4.模式的结构和使用

代理模式主要包括三种角色
1.抽象主题(Subject):抽象主题是一个接口,该接口是对象和它代理所共有的接口,即是RealSubject角色和Proxy角色实例所共同实现的接口;
2.实际主题(ReaLSubject):实际主题是实现抽象主题接口的类。实际主题的实例是代理角色Proxy实例所要代理的对象;
3.代理(Proxy):代理是实现抽象主题接口的类。代理包含主题接口声明的变量,该变量用来存放RealSubject角色的实例引用,这样一来,代理的实例就可以控制对它所包含的RealSubject角色的实例访问,即可以控制对它所代理对象的访问。

1.代理模式的类图

前面所提到的Phone接口就是代理模式的抽象主题(Subject),Boss类就是实际主题(RealSubject)角色,Secretary类就睡代理角色(Proxy)。

2.结构的描述

以下通过一个简单的问题来描述怎么样使用代理模式,这个简单问题就是:
用户输入三个代表三角形三边长的数值,代理对象验证用户输入的三个数值是否能够构成三角形,如果能构成三角形,就创建一个三角形对象,并让该三角形对象计算自身的面积。
1.抽象主题(Subject)
定义了一个类名为Geometry的接口,里面定义了一个抽象方法getArea

package com.xing.proxy;
//几何图形接口
public interface Geometry {public double getArea();
}

2.实际主题(RealSubject)
在实际主题中,利用海伦公式给出了计算三角形面积的公式 ,实现了抽象方法getArea,代码如下所示:

package com.xing.proxy;public class Triangle implements Geometry{double sideA,sideB,sideC,area;public Triangle(double sideA, double sideB, double sideC) {this.sideA = sideA;this.sideB = sideB;this.sideC = sideC;}//利用海伦公式计算三角形的面积//利用@Overridepublic double getArea() {double p=(sideA+sideB+sideC)/2;return Math.sqrt(p*(p-sideA)*(p-sideB)*(p-sideC));}
}

3.代理
在代理类getArea方法中,如果用户输入的三条边可以构成三角形,则计算三角形面积,否则就不用创建三角形对象,直接返回-1;

package com.xing.proxy;public class TriangleProxy implements Geometry{double sideA,sideB,sideC;Triangle triangle;public void setABC(double sideA, double sideB, double sideC) {this.sideA = sideA;this.sideB = sideB;this.sideC = sideC;}@Overridepublic double getArea() {if(sideA+sideB>sideC && sideB+sideC>sideA && sideC+sideA>sideB){//满足条件则可以构成三角形triangle=new Triangle(sideA,sideB,sideC);double area = triangle.getArea();//让代理对象调用getArea方法return area;}else{return -1;}}
}

4.主程序测试

package com.xing.proxy;import java.util.Scanner;public class Application {public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("请输入三角形的三条边的长度");double a=sc.nextDouble();double b=sc.nextDouble();double c=sc.nextDouble();TriangleProxy proxy=new TriangleProxy();proxy.setABC(a,b,c);double area = proxy.getArea();System.out.println("面积是:"+area);}
}

5.测试结果展示:

5.代理模式的优点

1.代理模式可以屏蔽用户真正请求的对象,使用户程序和真正的对象之间解耦;
2.使用代理来担当那些创建耗时的对象的替身。

设计模式:(代理模式)相关推荐

  1. Python设计模式-代理模式

    Python设计模式-代理模式 基于Python3.5.2,代码如下 #coding:utf-8info_struct = dict() info_struct["addr"] = ...

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

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

  3. 设计模式——代理模式

    设计模式--代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能 ...

  4. 23种设计模式----------代理模式(一)

    代理模式也叫委托模式. 代理模式定义:对其他对象提供一种代理从而控制对这个对象的访问.就是,代理类 代理 被代理类,来执行被代理类里的方法. 一般情况下,代理模式化有三个角色. 1,抽象的主题类(或者 ...

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

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

  6. 第四章 Caché 设计模式 代理模式

    文章目录 第四章 Caché 设计模式 代理模式 定义 类型 使用场景 优点 缺点 结构图 完整示例 抽象主题类 真实主题类 代理类 对象类 调用 思考 第四章 Caché 设计模式 代理模式 定义 ...

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

    文章目录 1. 前言 2. 远程代理(Remote Proxy) 3. 后记 1. 前言 在上篇Android常见设计模式--代理模式(Proxy Pattern)中基本上知道了什么是代理模式,以及对 ...

  8. sheng的学习笔记-设计模式-代理模式

    原理图: 代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问.这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. 至少在以下集中情况下可以用 ...

  9. 设计模式-代理模式(Proxy Pattern)

    设计模式-代理模式(Proxy Pattern) 文章目录 设计模式-代理模式(Proxy Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.小结 六.动态代理 ...

  10. 简说设计模式——代理模式

    一.什么是代理模式 关于代理模式,我们听到的见到的最多的可能就是静态代理.动态代理之类的,当然还有大家都知道的Spring Aop,这里我们先不谈这些个代理,先说个简单的例子.游戏代练应该都听说过,许 ...

最新文章

  1. 【cs229-Lecture7】支持向量机(SVM)
  2. 探究chrome下的开发工具的各功能
  3. Mybatis一级缓存、二级缓存
  4. mysql未知数据库_如何处理这个错误(1049,“未知数据库”/ users / ohyunjun / work / astral / mysql“”)...
  5. Activiti源码 之工厂模式
  6. 音视频开发(31)---H.264格式分析
  7. 12月10日见!卢伟冰:红米K30将用上液冷散热
  8. 华为重磅新专利公布: 一种拍摄月亮的方法和电子设备
  9. 马斯克回应停工事件:Model 3周产量将达6000辆,不开玩笑哦
  10. printf格式化字符串_Java printf()–将格式化的字符串打印到控制台
  11. 劳务派遣计算机信息管理系统,劳务派遣人员信息管理系统
  12. 无密码如何破解PDF加密
  13. 2021-09-30 node上传文件的问题以及如何选择适合自己的插件
  14. 欢度世界杯——倒时差
  15. 一,银行软件测试工作总结
  16. 基于 Node.js + Koa 构建完整的 Web API (配置 ESLint 和使用 Airbnb 编码规范)
  17. 有的项目是没有seting ,.project文件的,import时not project found处理办法
  18. GMM / MoG 聚类 Matlab 可视化 实现
  19. poi画饼图、折线图等图表和设置颜色字体等
  20. 场效应管微变等效电路的计算_微变等效电路如图.ppt

热门文章

  1. 【BLE】蓝牙低功耗
  2. pip安装pandas
  3. 【数据挖掘】4. 打散(Shattering) VC维数 基于VC维数和Margin的泛化定理
  4. 百度不收录原因分析——Spider抓取篇
  5. 若菜acmer感觉自己智商完全被碾压了QAQ~~
  6. php中tp5事务,TP5 模型事务操作
  7. macbook pro快捷键
  8. 阿里B2B总裁戴珊:全球化的天猫双11,普惠全球共享快乐
  9. SSH登陆出现Permission denied (publickey)错误解决方案
  10. ORA-00257 mysql_ORA-00257错误诊断及解决方法