在我们实际生活中代理情况无处不在!你在淘宝上面买东西,你使用支付宝平台支付,卖家请物流公司发货、你请朋友帮你拿包裹,在这个过程汇总支付宝、物流公司、你朋友都扮演者“第三者”的角色在帮你完成物品的购买,这里的第三者我们可以将其称之为代理者。

所谓代理就通过引用一个新的对象来实现对真实对象的操作或者将新的对象当做真实对象的一个替身,这种实现的机制就是代理模式,通过引用代理对象来访问真实对象就是代理模式的设计动机。

一、 模式定义

代理模式就是给一个对象提供一个代理,并由代理对象控制对原对象的引用。

在代理模式中,“第三者”代理主要是起到一个中介的作用,它连接客户端和目标对象。

二、 模式结构

下图是代理模式UML结构图

在代理模式中有如下三个角色:

Subject: 抽象角色。声明真实对象和代理对象的共同接口。

Proxy: 代理角色。代理对象与真实对象实现相同的接口,所以它能够在任何时刻都能够代理真实对象。代理角色内部包含有对真实对象的引用,所以她可以操作真实对象,同时也可以附加其他的操作,相当于对真实对象进行封装。

RealSubject: 真实角色。它代表着真实对象,是我们最终要引用的对象

三、 模式实现

读大学的时候都追过女生吧!某天你看到一位美女,一见钟情,心里发誓要她做你女朋友。但是你想这样直接上去可能会唐突了。于是你采用迂回政策,先和她室友搞好关系,然后通过她室友给她礼物,然后……。

首先出现的就是美女一枚:BeautifulGirl.java

public class BeautifulGirl {String name;public BeautifulGirl(String name){this.name = name;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

然后是抽象主题,送礼物接口:GiveGift.java

public interface GiveGift {/*** 送花*/void giveFlowers();/*** 送巧克力*/void giveChocolate();/*** 送书*/void giveBook();
}

你小子:You.java

public class You implements GiveGift {BeautifulGirl mm ;     //美女public You(BeautifulGirl mm){this.mm = mm;}public void giveBook() {System.out.println(mm.getName() +",送你一本书....");}public void giveChocolate() {System.out.println(mm.getName() + ",送你一盒巧克力....");}public void giveFlowers() {System.out.println(mm.getName() + ",送你一束花....");}}

她闺蜜室友:HerChum.java

public class HerChum implements GiveGift{You you;public HerChum(BeautifulGirl mm){you = new You(mm);}public void giveBook() {you.giveBook();}public void giveChocolate() {you.giveChocolate();}public void giveFlowers() {you.giveFlowers();}}

客户端:Client.java

public class Client {public static void main(String[] args) {BeautifulGirl mm = new BeautifulGirl("小屁孩...");HerChum chum = new HerChum(mm);chum.giveBook();chum.giveChocolate();chum.giveFlowers();}
}

运行结果

小屁孩...,送你一本书....

小屁孩...,送你一盒巧克力....

小屁孩...,送你一束花....

好了礼物已经送出去了,能不能搞定就看你的魅力了!!!!

四、 模式优缺点

优点

1、 代理模式能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

2、 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的

缺点

1、由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。

2、 实现代理模式需要额外的工作,有些代理模式的实现非常复杂。

五、 模式适用场景

1、 远程代理:为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

2、 虚拟代理:通过使用过一个小的对象代理一个大对象。这样就可以减少系统的开销。

3、 保护代理:用来控制对真实对象的访问权限。

六、 模式总结

1、代理模式是通过使用引用代理对象来访问真实对象,在这里代理对象充当用于连接客户端和真实对象的中介者。

2、代理模式主要用于远程代理、虚拟代理和保护代理。其中保护代理可以进行访问权限控制。

转载于:https://www.cnblogs.com/oversea201405/p/3752115.html

设计模式读书笔记-----代理模式相关推荐

  1. 设计模式学习笔记-代理模式

    1. 概述 为其它对象提供一种代理以控制对这个对象的访问. 解决的问题:如果直接访问对象比较困难,或直接访问会给使用者或系统带来一系列问题.这样对于客户端(调用者)来说,就不需要直接与真实对象进行交互 ...

  2. 设计模式读书笔记-----模板方法模式

    首先我们先来看两个例子:冲咖啡和泡茶.冲咖啡和泡茶的基本流程如下: 所以用代码来创建如下: 咖啡:Caffee.java public class Coffee {void prepareRecipe ...

  3. 设计模式读书笔记-单件模式

    单件模式- 确保一个类只有一个实例,全局只有一个入口点. 类如下: public class Singleton { private static Singleton uniqueInstance; ...

  4. Head First设计模式读书笔记——策略模式

    问题描述: 目前的任务是实现一个FPS类游戏的各种角色(友军.敌军.平民和狗.猫.鸭子等动物)以及他们的各种行为(攻击.游泳等). 设计方案一 很简单,只要实现一个角色超类,将角色的各种行为放入超类中 ...

  5. 设计模式读书笔记-----备忘录模式

    个人比较喜欢玩单机游戏,什么仙剑.古剑.鬼泣.使命召唤.三国无双等等一系列的游戏我都玩过(现在期待凡人修仙传),对于这些游戏除了剧情好.场面大.爽快之外,还可以随时存档,等到下次想玩了又可以从刚开始的 ...

  6. 设计模式学习笔记——代理(Proxy)模式

    设计模式学习笔记--代理(Proxy)模式 @(设计模式)[设计模式, 代理模式, proxy] 设计模式学习笔记代理Proxy模式 基本介绍 代理案例 类图 实现代码 Printable接口 Pri ...

  7. 设计模式笔记——代理模式

    设计模式笔记--代理模式 代理模式介绍 代理模式通常是介于请求方和提供方的一个中介系统,请求方是发送请求的一方,提供方是根据请求提供相应资源的一方 Web中的代理服务器就是一个例子,客户端向代理服务器 ...

  8. 设计模式读书笔记-----工厂方法模式

    一.问题 在前一章<设计模式读书笔记-----简单工厂模式>中通过披萨的实例介绍了简单工厂模式.在披萨实例中,如果我想根据地域的不同生产出不同口味的披萨,如纽约口味披萨,芝加哥口味披萨.如 ...

  9. 大话设计模式读书笔记

    主题 概要 设计模式 大话设计模式读书笔记 编辑 时间 新建 20170423 序号 参考资料 1 大话设计模式 重新看了一遍设计模式,除了一些已经特别熟悉的模式,都自己敲了一遍代码,有些豁然开朗的感 ...

最新文章

  1. es mysql延迟_ES 近实时搜索 更新延迟问题
  2. AI看脸、测肤,左可美妆新零售,右能智慧医美
  3. 国内趋于概念化的 “数据分析”在硅谷是怎样真正落地的?
  4. FGUI使用方法(一):安装和设置FGUI
  5. 微型计算机原理与接口技术AD实验报告,微机原理与接口技术AD转换综合实验报告.doc...
  6. 宏函数比普通函数效率高
  7. FIL新一轮上涨:FIL算力通证迎来新热潮
  8. css绝对定位如何居中?css绝对定位居中的四种实现方法-web前端教程
  9. OpenFOAM 学习笔记
  10. 第二周 Linux文件管理类命令及bash基本特性
  11. c语言eallow,求大神指导C语言框图设计!!!
  12. [幽默网文]2009高考作文语录
  13. windows10计算机里输入法,win10电脑上输入法不见了怎么办
  14. error: use of undeclared identifier 'bool'以及C各编译器问题
  15. Python:测试代码
  16. c语言中5l是数值或字符常量,C语言练习题-选择题(带答案)
  17. 【答学员问】面试被拒后HR又一次打电话问,是否可以去上班?
  18. 汽车VIN编码的详细规则
  19. Android Studio使用mp4parser进行视频的分割
  20. 串口通讯常用方法及CRC校验

热门文章

  1. 每天一道LeetCode-----计算字符串s中有多少个子序列和字符串t相等
  2. md5可以解密吗_Python训练营作业1:加密解密
  3. 通过OpenFoam记录一些c++的trick(持续更新)
  4. mac 10.10.5 mysql_Macbook os x 10.10.5 下装mysql 一些记录
  5. 《iOS应用逆向工程(第2版)》高清电子书 PDF
  6. C++ std::condition_variable wait() wait_for() 区别
  7. redis中KEYS替代命令
  8. list 用法总结2
  9. 数据结构课程设计(VS2012-c语言):算术表达式实现(加减乘除)
  10. Linux软件源apt,仓库,包的概念