- 浏览: 12574 次
- 性别:
- 来自: 大连
最近访客 更多访客>>
文章分类
最新评论
-
weishuguangeye:
写的非常好,总结的也非常好!感谢!
初学Java设计模式随记 -- 抽象工厂(Abstract Factory)模式
代理(Proxy)模式
1. 用意:
为其他对象提供一种代理以控制对这个对象的访问。
(给某一对象提供代理对象,并由代理对象控制具体对象的引用. )
2.参与者:
• 抽象主题(Subject): 定义真实主题(Real Subject)和代理(Proxy)的共用接口,这样就在任何使用真实主题(Real Subject)的地方都可以使用代理(Proxy)。
• 真实主题(Real Subject): 定义代理(Proxy)所代表的实体。
• 代理(Proxy):
1)内部含有对真实主题(Real Subject)对象的引用,从而可以操作真实主题(Real Subject)对象;
2)同时代理主题(Proxy)对象提供与真实主题(Real Subject)对象相同的接口抽象主题(Subject),以便在任何 时刻都能代替真实主题(Real Subject);
3)控制对真实主题(Real Subject)引用,负责在需要的时候创建(或删除)真实主题对象;
4)同时,代理(Proxy)对象可以在执行真实主题(Real Subject)对象操作时,附加其他的操作,而不是单纯的将调用传递给真实主题(Real Subject)对象。
3.结构:
个人觉得代理模式是比较容易理解的一种设计模式。
还是通过现实生活来理解代理模式。
现实生活中经常会听到代理商这个词汇,通过与代理商打交道,买家可以得到更好更多的服务,卖家也可以专注于产品的生产,而不必把更多的精力耗费在别的事情上。
还以买汽车为例,现实生活中,去向卖家(抽象主题(Subject))买汽车,通常不直接向厂家(真实主题(Real Subject))购买汽车,可以到4S店(代理(Proxy)角色)买汽车,那里可以得到更多的服务。
看看Java代码怎么实现:
汽车的销售商(抽象主题):
/** * 抽象主题(Subject) * * 汽车的销售商 * */ public interface CarSeller { /* * 销售汽车 */ public Object sellCars(int type); }
奥迪厂家(真实主题):
/** * 真实主题(Real Subject)角色 * 奥迪厂家 * */ public class AudiCarFactory implements CarSeller { /* * 实现了抽象主题(Subject)角色的方法 */ public Object sellCars(int type) { System.out.println("奥迪工厂出售汽车。"); if(type == 1){ return "AudiA6"; }else{ return "AudiA8"; } } }
汽车代理商(代理):
** * 代理(Proxy)角色 * * 汽车代理商 * (这个代理商销售的是奥迪汽车) * */ public class CarProxy implements CarSeller { private AudiCarFactory carFactory = new AudiCarFactory(); /* * 同样也实现了抽象主题(Subject)角色的方法 */ public Object sellCars(int type) { // 售前服务 serveBeforeSell(); // 代理奥迪厂家来销售汽车 Object car = carFactory.sellCars(type); System.out.println("由代理商从厂家取得客户需要的汽车"); // 售后服务 serveAfterSell(); return car; } protected void serveBeforeSell(){ System.out.println("汽车代理商为客户提供了一些售前服务"); } protected void serveAfterSell(){ System.out.println("汽车代理商为客户提供了一些售后服务"); } }
顾客(客户端调用):
/** * 客户端调用 */ public class Customer { public static void main(String[] args){ // 顾客找到代理商 CarSeller carSeller = new CarProxy(); // 由代理商来销售汽车,可以发现代理商在销售给顾客汽车时,为顾客提供了更多的其他服务 Object car = carSeller.sellCars(1); System.out.println("顾客从代理商那里买了一辆" + car); } }
运行结果:
汽车代理商为客户提供了一些售前服务 奥迪工厂出售汽车。 由代理商从厂家取得客户需要的汽车 汽车代理商为客户提供了一些售后服务 顾客从代理商那里买了一辆AudiA6
代理模式有什么优势呢?
通过代理模式,在客户端和真实主题(Real Subject)之间,添加了一个中间者,避免了客户端直接访问真实主题(Real Subject),这样做,有如下好处:
1)如上面的例子所示,可以在访问真实主题之前或之后,添加一些额外的操作;
2)能隐藏一些访问的细节;
3)能对真实主题的访问添加一些控制,例如:安全验证等。
根据上面的例子,可以发现代理模式中,真实主题(Real Subject)角色必须是事先存在的,并将其作为代理(Proxy)对象的内部属性。这其实是静态代理(Static Proxy)模式。
在静态代理模式中,代理(Proxy)和真实主题(Real Subject)的关系是在代码中已经被事先定义好,固定不变的。
试想一下,如果代理商增加或更换了代理的产品的种类(例如:为宝马汽车做代理),
1)那么,是不是需要修改代理(Proxy)类?这样做会影响现有系统的稳定。
2)如果不修改现有代理(Proxy)类,而是添加一个新的代理类(新增加一个类的代码风险要大大低于对已有类的代码的修改),确保一个真实主题(Real Subject)角色对应一个代理(Proxy)角色,又会导致类的急剧膨胀。
这种紧密地耦合,不利于系统的扩展以及应对以后的需求变化。
那么有没有什么办法,可以使系统在运行时,根据需要动态地来绑定真实主题(Real Subject)和代理(Proxy)之间的关系呢?
动态代理(Dynamic Proxy)给出了解决方法,参看初学Java设计模式随记 -- 代理(Proxy)模式之动态代理(Dynamic Proxy)
发表评论
-
初学Java设计模式随记 -- 适配器(Adpater)模式
2011-01-10 10:10 0适配器(Adpater)模式 1.用意: 将一个类的 ... -
初学Java设计模式随记 -- 装饰(Decorator)模式
2011-01-06 21:32 978装饰(Decorator)模式又叫包装器(Wrapper)模式 ... -
初学Java设计模式随记 -- 代理(Proxy)模式之动态代理(Dynamic Proxy)
2010-12-28 20:51 950什么是动态代理? 被代理的对象(真实主题(RealSu ... -
初学Java设计模式随记 -- 原型(Prototype)模式
2010-12-11 16:44 929原型(Prototype)模式也有 ... -
初学Java设计模式随记 -- 单例(Singleton)模式
2010-12-01 22:19 740本篇内容主要摘取自GoF的设计模式和阎宏的《Java与模式》 ... -
预览文章: 初学Java设计模式随记 -- 建造者(BUILDER)模式
2010-11-30 22:49 780建造者(BUILDER)模式又叫生成器(BUILDER) ... -
初学Java设计模式随记 -- 抽象工厂(Abstract Factory)模式
2010-11-20 22:44 1138抽象工厂(Abstract Factory ... -
初学Java设计模式随记 -- 工厂方法(Factory Method)模式
2010-11-17 23:32 854工厂方法(Factory Method)模式,又叫做虚拟构造子 ... -
初学Java设计模式随记 -- 简单工厂模式(Simple Factory Pattern)
2010-11-17 23:32 1199简单工厂(Simple Factory)模式: 又称静态工厂方 ... -
初学Java设计模式随记 -- 工厂模式(Factory Pattern) 续
2010-11-14 21:03 850利用工厂模式可以将对象的创建过程和使用进行分离(也就是解藕), ... -
初学Java设计模式随记 -- 工厂模式(Factory Pattern)
2010-11-10 13:13 882在阎宏《JAVA与设计 ... -
初学Java设计模式随记 -- GOF 设计模式分类
2010-11-05 09:42 816以下摘自《GOF设计模式 可复用面向对象软件的基础》中文 ... -
初学Java设计模式随记 -- 带着疑问学习设计模式
2010-11-04 00:07 875最近在学习设计模式时,发现总是会有一些疑问,有的能找到答案,有 ... -
初学Java设计模式随记 -- 为什么学习设计模式
2010-11-03 21:26 697这段时间在学习设计模 ...
相关推荐
NULL 博文链接:https://andycbluo.iteye.com/blog/2269582
Java.util包常用接口
java随记
OleDbDataAdapter 不会自动生成,为了使对 DataSet 所作的更改和相关联的数据源协调起来所必须的 SQL 语句。但是,如果设置了 OleDbDataAdapter 的 SelectCommand 属性,那么就可以创建 OleDbCommandBuilder 对象,来...
JSP PDF打印 随记 复杂模板设计
数据分级存储及访问方式设计方案研究随记.docx数据分级存储及访问方式设计方案研究随记.docx
c# 随记.docx
NULL 博文链接:https://lobin.iteye.com/blog/2365756
VC++2010游戏开发随记之十三.pdf
网络原理随记.pdf
用户信息手账信息 第一章 用户信息信息设计 2 用户信息信息设计昵称限制:1~18位(非必需、如果没有输入则自动生成一个随机字符串6~12位、特殊符号非法)
互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf互联网公司实习日记随记参考.pdf
linux net 管理随记,留着个人备忘
三天不读书&智商输给猪-世界读书日ppt随记PPT模板.pptx
学习c++过程中的一些知识点随记,我感觉重要的就稍微记了一下,比较简略,但是快速的阅读的话可以提醒自己想起那一部分的知识点。在复习c++知识点的时候,有些帮助。
Unity 随记1
生产不重复19位随机数,测试1000000数据没重复
git随记 git
面试随记???随时更新
一款很好用的java反编译软件,直接下载就可以使用,无需安装软件