设计模式:(代理模式)
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.使用代理来担当那些创建耗时的对象的替身。
设计模式:(代理模式)相关推荐
- Python设计模式-代理模式
Python设计模式-代理模式 基于Python3.5.2,代码如下 #coding:utf-8info_struct = dict() info_struct["addr"] = ...
- Java设计模式(代理模式-模板方法模式-命令模式)
Java设计模式Ⅴ 1.代理模式 1.1 代理模式概述 1.2 静态代理 1.2.1 静态代理概述 1.2.2 代码理解 1.3 动态代理之JDK代理 1.3.1 动态代理之JDK代理概述 1.3.2 ...
- 设计模式——代理模式
设计模式--代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能 ...
- 23种设计模式----------代理模式(一)
代理模式也叫委托模式. 代理模式定义:对其他对象提供一种代理从而控制对这个对象的访问.就是,代理类 代理 被代理类,来执行被代理类里的方法. 一般情况下,代理模式化有三个角色. 1,抽象的主题类(或者 ...
- java设计模式代理模式_Java中的代理设计模式
java设计模式代理模式 代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问. 代理充当原始对象的轻量级版本或简化版本. 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它 ...
- 第四章 Caché 设计模式 代理模式
文章目录 第四章 Caché 设计模式 代理模式 定义 类型 使用场景 优点 缺点 结构图 完整示例 抽象主题类 真实主题类 代理类 对象类 调用 思考 第四章 Caché 设计模式 代理模式 定义 ...
- Android常见设计模式——代理模式(Proxy Pattern)(二)
文章目录 1. 前言 2. 远程代理(Remote Proxy) 3. 后记 1. 前言 在上篇Android常见设计模式--代理模式(Proxy Pattern)中基本上知道了什么是代理模式,以及对 ...
- sheng的学习笔记-设计模式-代理模式
原理图: 代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问.这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介. 至少在以下集中情况下可以用 ...
- 设计模式-代理模式(Proxy Pattern)
设计模式-代理模式(Proxy Pattern) 文章目录 设计模式-代理模式(Proxy Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.小结 六.动态代理 ...
- 简说设计模式——代理模式
一.什么是代理模式 关于代理模式,我们听到的见到的最多的可能就是静态代理.动态代理之类的,当然还有大家都知道的Spring Aop,这里我们先不谈这些个代理,先说个简单的例子.游戏代练应该都听说过,许 ...
最新文章
- 【cs229-Lecture7】支持向量机(SVM)
- 探究chrome下的开发工具的各功能
- Mybatis一级缓存、二级缓存
- mysql未知数据库_如何处理这个错误(1049,“未知数据库”/ users / ohyunjun / work / astral / mysql“”)...
- Activiti源码 之工厂模式
- 音视频开发(31)---H.264格式分析
- 12月10日见!卢伟冰:红米K30将用上液冷散热
- 华为重磅新专利公布: 一种拍摄月亮的方法和电子设备
- 马斯克回应停工事件:Model 3周产量将达6000辆,不开玩笑哦
- printf格式化字符串_Java printf()–将格式化的字符串打印到控制台
- 劳务派遣计算机信息管理系统,劳务派遣人员信息管理系统
- 无密码如何破解PDF加密
- 2021-09-30 node上传文件的问题以及如何选择适合自己的插件
- 欢度世界杯——倒时差
- 一,银行软件测试工作总结
- 基于 Node.js + Koa 构建完整的 Web API (配置 ESLint 和使用 Airbnb 编码规范)
- 有的项目是没有seting ,.project文件的,import时not project found处理办法
- GMM / MoG 聚类 Matlab 可视化 实现
- poi画饼图、折线图等图表和设置颜色字体等
- 场效应管微变等效电路的计算_微变等效电路如图.ppt