- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
GoF几种设计模式举例及其应用
GoF几种设计模式举例及其应用
1090379131 易余
GOF即Gang of Four,就Java语言体系来说,GOF的设计模式是Java基础知识和J2EE框架知识之间一座隐性的桥。实际上,GoF的设计模式并不是一种具体技术,它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,GoF的设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。本文介绍几种常用的设计模式的举例和应用。
适配器(Adapter)
如何解决不相容的接口问题,或者如何为具有不同接口的类似构件提供稳定的接口?这样的问题的解决方案就是通过中介适配器对象,将构件的原有接口转换为其他接口。应用举例:POS系统需要支持多种第三方外部服务,其中包括税金计算器,信用卡授权服务,库存系统和账务系统。这些外部服务都具有不同的API,并且无法改变。
这样的问题解决方案就是:增加一层间接性对象,通过这些间接对象将不同的外部接口调整为在应用程序内使用的一致接口。
如上图所示,对于选定的外部服务,将选用一个特定的适配器实例来表示。例如针对账务系统的SAP,当向外部接口发出postSale请求时,首先通过适配器进行转换,使其能够通过HTTP上的SOAP XML接口来访问在SAP在局域网上提供的Web Service。
单实例类(Singleton)
工厂设计模式也称为简单工厂,经常描述为抽象工厂的变种。工厂设计模式引发出另一个新的问题,即谁来创建工厂自身和如何访问工厂。
代码在不同的位置都需要访问适配器以调用外部服务,所以就需要代码在不同的位置调用工厂中的方法。在这里就存在可见性的问题,即如何获得单个工厂实例的可见性以及单点访问。
解决方案:对类定义静态方法返回单实例。其中的关键思想是,对类定义静态方法getInstance,该方法提供了类的唯一实例。例如:
public class Register
{
public void Initialize
{
… do some work …
AccountingAdapter=ServicesFactory.getInstance().getAccountingAdapter();
… do somework …
}
}
由于公共类的可见性是全局的,因此代码的任何一点,在类的任何方法中,都可以写为:
SingletonClass.getInstance()
例如SingletonClass.getInstance().doFoo(),这种写法就是为了获得对于单实例类的实例可见性,并且对其发送消息。
单实例类还存在另一个问题,为什么不将所有服务的方法都定义成类自己的静态方法,而是使用有实例方法的实例对象?原因如下:
实例方法允许定义单实例类的子类以对其进行精化。静态的方法不是多态的,而且大多数语言中不允许在子类中对其覆写。
大多数面向对象的远程通信机制只支持实例方法的远程使用而不支持静态方法。
类并非在所有的场景中都是单实例类。在一个应用中是单实例的,而在另一个实例中却可能是多实例的,并且在开始设计的时候考虑使用单实例的不多见。因此使用实例方法的解决方案有更大的灵活性。
观察者模式(Observer)
观察者模式支持低耦合,它允许现有视图或者表示层使用新的窗口来代替特定的窗口,同时不会对非UI对象产生影响。例如,如果模型对象不知道Java Swing对象,那么久可以拔掉Swing接口或者特定的窗口,然后插入其他的东西。
不同类型的观察者关注观察对象的状态变化或事件,并且在观察对象产生事件时以自己独特的方式的做出反应。观察对象与观察者保持低耦合,就使用观察者设计模式。
解决方案为:定义观察者接口,观察者实现此接口。对象可以动态关注某事件的观察者,并在事件发生时通知他们。下图描述了此类解决方案。
此例的主要思想和步骤是:
定义接口。在本例中式具有onPropertyEvent操作的PropertyListener。
定义实现该接口的窗口。SaleFrame1实现onPropertyEvent方法。
在SaleFrame1窗口初始化时,向其传递Sale实例以显示总额。
SaleFrame1窗口通过addPropertyListener消息向Sale实例注册或者订阅特性事件的通知。也就是说总额变化时,该窗口会得到通知。
Sale并不知道SaleFrame1对象,它只知道实现了PropertyListener对象。这样就降低了Sale和窗口的耦合。
Sale实例就成为了特性事件的发布者,当总额发生变化时,它会遍历所有订阅了的PropertyListener,并且通知每一个订阅者。
SaleFrame1就是
文档评论(0)