设计模式<三>代理模式
来源:互联网 发布:淘宝卖家怎么投诉评价 编辑:程序博客网 时间:2024/04/25 20:27
设计模式概述见:
http://blog.csdn.net/chijiandi/article/details/78839305
代理模式的基本概念
代理模式是为其他对象提供一种代理以控制对这个对象的访问。
换句话说就是客户端某些情况下不能或者不好直接和对象进行交互,就与它的代理交互,交互的代理可以扩展原对象的功能且不会改变原对象,这就是一种开放-封闭的设计原则。
什么时候使用代理模式
举两个例子,
比如张三想打李四,可是打不过他,所以找了王五把李四揍了一顿,而李四不知道是张三想打他。
又比如我想买苹果10,可是苹果10国内没有出售,所以我找了代购出国买回来给我。
例子可能不恰当,但是思想是这样的思想。
以下是代理模式的4种应用场景:
- 远程代理:隐藏一个对象存在于不同地址空间的事实。
- 虚拟代理:通过它存放实例化需要很长时间的真实对象。
- 安全代理:控制真实对象访问时的权限。
- 智能指引:是指当调用真实的对象时,代理处理另外一些事。
代理模式怎么用
通常,对代理模式的使用下我们会抽取出需要代理的类的所有接口,接口是一种规范,我们不太可能强制所有程序员不用接口自己遵守这种规范。
代理模式使用很简单,将被代理类组合进代理类内部,并通过自己同样的方法实现代理类所有的方法。
比如说,代购花钱买东西,在别人看上去是代购花了钱买了东西,但是方法内部实际上是我花钱买东西。
以代购为例,首先,我们需要抽取出公共的接口,买苹果:
/*** @ClassName: BuyApple * @Description: 买苹果* @author cjd* @date 2017年12月18日 下午4:59:45 */public interface BuyApple { void buyApple();}
然后,我们需要有一个需要代理的类,买苹果8的人:
/*** @ClassName: Person * @Description: 买苹果的人,有人名,有钱* @author cjd* @date 2017年12月18日 下午5:00:14 */public class Person implements BuyApple { private int money; private String name; public Person(String name, int money) { this.setName(name); this.setMoney(money); } @Override public void buyApple() { System.out.println("花了"+money+"买苹果8"); } public int getMoney() { return money; } public void setMoney(int money) { this.money = money; } public String getName() { return name; } public void setName(String name) { this.name = name; }}
可是就算我有钱也没地方买苹果,所以我们需要找一个代理帮我们出国买苹果:
/*** @ClassName: Proxy * @Description: 代购,帮Person买苹果* @author cjd* @date 2017年12月18日 下午5:02:49 */public class Proxy implements BuyApple { private Person person; public Proxy(Person buyer) { this.person = buyer; } @Override public void buyApple() { System.out.println("出国"); person.buyApple(); System.out.println("回国把苹果8交给" + person.getName()); }}
代理很简单,其内部封装了要代理的Person,代理的买苹果其实执行的是Person的买苹果,而代理替Person扩展的只是出国以及回国的扩展。
主函数这样进行调用:
/*** @ClassName: Main * @Description: TODO(这里用一句话描述这个类的作用) * @author cjd* @date 2017年12月18日 下午5:06:55 */public class Main { public static void main(String[] args) Person cjd = new Person("池剑迪", 10000); Proxy proxy = new Proxy(cjd); proxy.buyApple(); }}
运行代理的结果是
出国花了10000买苹果8回国把苹果8交给池剑迪
而出国以及回国是Person不具备的功能也没有修改Person,这就实现了开放-封闭原则。这也是代理的一种基本应用。
后记
代理模式其实就是对真实对象的一个代表,但同时因为生成代理的对象,增加了复杂性也同时增加了内存的开销,当设计的时候,和其他模式一样,过犹不及。
如有理解错误,感谢指出!
- 设计模式三 代理模式
- 三.设计模式-代理模式
- 设计模式<三>代理模式
- 设计模式(三) ----代理模式
- 设计模式之代理模式 (三)
- 设计模式(三)--代理模式
- java设计模式--代理模式(三)
- 设计模式之三静态代理模式
- JAVA设计模式之三:代理模式
- Java/Android设计模式<三> 代理模式
- 设计模式--【代理模式】
- 设计模式:代理模式
- 设计模式--代理模式
- 设计模式---代理模式
- 设计模式-代理模式
- 设计模式---代理模式
- 设计模式 代理模式
- 设计模式-【代理模式】
- C++ primer学习 12.19
- Mysql优化综合方案
- 周明:中国NLP如何跻身世界顶尖水平?
- 算法与数据结构——算法题 154:全民飞机大战游戏的红包功能(腾讯2017校招笔试题) ? 待解决
- sizeof和strlen()区别
- 设计模式<三>代理模式
- curl使用
- Jupyter notebook入门教程(上)
- make/Makefile&&进度条&&yum
- 阿里云centos环境之修改ssh默认端口<八>
- go语言学习笔记分享
- 任务调度的合理性(拓扑排序)
- 七牛云存储java上传图片
- 清华大学生用微积分证明薯片掉地上可以捡起来吃……