设计模式
文章平均质量分 84
LoveLion
这个作者很懒,什么都没留下…
展开
-
对象间的联动——观察者模式(二)
22.2 观察者模式概述 观察者模式是使用频率最高的设计模式之一,它用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应。在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间可以没有任何相互联系,可以根据需要增加和删除观察者,使得系统更易于扩展。 观察者模原创 2012-07-05 23:34:09 · 24908 阅读 · 13 评论 -
对象间的联动——观察者模式(三)
23.3 完整解决方案 为了实现对象之间的联动,Sunny软件公司开发人员决定使用观察者模式来进行多人联机对战游戏的设计,其基本结构如图22-4所示:图22-4 多人联机对战游戏结构图 在图22-4中,AllyControlCenter充当目标类,ConcreteAllyControlCenter充当具体目标类,Observer充当抽象观察者,Player原创 2012-07-05 23:53:01 · 18626 阅读 · 26 评论 -
对象间的联动——观察者模式(四)
22.4 JDK对观察者模式的支持 观察者模式在Java语言中的地位非常重要。在JDK的java.util包中,提供了Observable类以及Observer接口,它们构成了JDK对观察者模式的支持。如图22-5所示:图22-5 JDK提供的Observable类及Observer接口结构图 (1) Observer接口 在java.util.原创 2012-07-06 00:02:15 · 14404 阅读 · 8 评论 -
对象间的联动——观察者模式(五)
22.5 观察者模式与Java事件处理 JDK 1.0及更早版本的事件模型基于职责链模式,但是这种模型不适用于复杂的系统,因此在JDK 1.1及以后的各个版本中,事件处理模型采用基于观察者模式的委派事件模型(DelegationEvent Model, DEM),即一个Java组件所引发的事件并不由引发事件的对象自己来负责处理,而是委派给独立的事件处理对象负责。原创 2012-07-06 00:09:05 · 13925 阅读 · 10 评论 -
对象间的联动——观察者模式(六)
22.6 观察者模式与MVC 在当前流行的MVC(Model-View-Controller)架构中也应用了观察者模式,MVC是一种架构模式,它包含三个角色:模型(Model),视图(View)和控制器(Controller)。其中模型可对应于观察者模式中的观察目标,而视图对应于观察者,控制器可充当两者之间的中介者。当模型层的数据发生改变时,视图层将自动改变其显示内容。如图22-7所原创 2012-07-06 00:15:45 · 16421 阅读 · 14 评论 -
设计模式与足球(三)
行为型模式(上) (13) 职责链模式:布冯手抛球给基耶利尼、基耶利尼传给皮尔洛、皮尔洛带球过人之后将球直塞给快速插上的巴洛特利,巴洛特利倒钩射门,球进了,球进了,又是巴洛特利,巴洛特利立功了,伟大的意大利前锋!他继承了意大利的光荣传统,巴乔、因扎吉、皮耶罗在这一刻灵魂附体!巴洛特利代表了意大利足球悠久的历史和传统,在这一刻他不是一个人在战斗,他不是一个人! 在此,足球原创 2012-07-02 02:23:00 · 11816 阅读 · 11 评论 -
设计模式与足球(一)
今天晚上2012年欧洲杯决赛(西班牙 VS 意大利),作为一名铁杆球迷,偶当然不会错过(请不要让我来预测比分,我不是章鱼,更何况这两个队我都非常喜欢,输赢我都很淡定,),在静候决赛的这段时间,突然萌发一个想法,将设计模式跟足球联系到一起写点啥,就像当年那篇知名度极高的《追MM与设计模式》一样,以供娱乐!,话不多说,即刻动手! 创建型模式 (1) 工厂方法模式:近年原创 2012-07-01 23:45:00 · 13102 阅读 · 10 评论 -
设计模式与足球(二)
结构型模式 (6) 适配器模式:很多足球队都喜欢请外国教练(其中有一支我们都非常熟悉的国家队,名字偶就不说了,大家都懂的,),外国教练请回来通常很难跟队员直接交流(语言不通),因此需要配翻译,此时,翻译充当了教练和队员之间的适配器,负责协调教练和队员之间的交流。 例如:pass --> shoot --> goal 转换 传球 --> 射门 --> 进球原创 2012-07-02 01:49:04 · 10057 阅读 · 8 评论 -
设计模式与足球(四)
行为型模式(下) 意大利昨晚太杯具了!!!不说了,继续把最后一部分写完。 (18) 备忘录模式:足球是圆的,一切皆有可能发生。要是有后悔药的话,如果能回到昨晚2012年欧洲杯决赛的中场休息,我相信普兰德利一定不会用莫塔换下蒙托利沃;如果能回到昨晚比赛开始,我相信一开始就不会让基耶利尼上场,如果能回到......(再回可能意大利就被德国淘汰了,)能回到吗?回不到哦,要是能回到过去的原创 2012-07-02 13:06:03 · 7880 阅读 · 13 评论 -
自定义语言的实现——解释器模式(四)
18.4 完整解决方案 为了能够解释机器人控制指令,Sunny软件公司开发人员使用解释器模式来设计和实现机器人控制程序。针对五条文法规则,分别提供五个类来实现,其中终结符表达式direction、action和distance对应DirectionNode类、ActionNode类和DistanceNode类,非终结符表达式expression和composite对应Sentence原创 2012-07-04 00:06:48 · 10880 阅读 · 11 评论 -
扩展系统功能——装饰模式(四)
12.4 透明装饰模式与半透明装饰模式 装饰模式虽好,但存在一个问题。如果客户端希望单独调用具体装饰类新增的方法,而不想通过抽象构件中声明的方法来调用新增方法时将遇到一些麻烦,我们通过一个实例来对这种情况加以说明:在Sunny软件公司开发的Sunny OA系统中,采购单(PurchaseRequest)和请假条(LeaveRequest)等文件(Documen原创 2012-04-04 16:40:13 · 17775 阅读 · 39 评论 -
复杂对象的组装与创建——建造者模式(三)
8.4 关于Director的进一步讨论 指挥者类Director在建造者模式中扮演非常重要的作用,简单的Director类用于指导具体建造者如何构建产品,它按一定次序调用Builder的buildPartX()方法,控制调用的先后次序,并向客户端返回一个完整的产品对象。下面我们讨论几种Director的高级应用方式: 1.省略Director 在原创 2012-04-04 23:26:00 · 21534 阅读 · 25 评论 -
抽象外观类的单例化分析与改造
有博友留言问“抽象外观类是否能设计为单例类?”,为了能够更全面地回答这个问题,并且为大家在进行面向对象系统设计和实现时提供更多思路,加深对外观模式和单例模式的理解,特写此文。 关于外观模式的基本知识我在此就不介绍了,大家可以参考之前有关外观模式的几篇文章。本文所使用的示例代码如下(此处采用一种特殊的包含@Stereotype的注释在源代码中标注模式角色,目的是在逆向工程生成的UML类图原创 2012-08-05 15:06:31 · 4054 阅读 · 1 评论 -
外观模式及其改进(二):抽象外观类的引入
在通用的外观模式结构图中,如果需要增加、删除或更换与外观类交互的子系统类,必须修改外观类或客户端的源代码,这将违背开闭原则,因此我们可以通过引入抽象外观类来对系统进行改进,在一定程度上解决该问题。在引入抽象外观类之后,客户端可以针对抽象外观类进行编程,对于新的业务需求,不需要修改原有外观类,而对应增加一个新的具体外观类,由新的具体外观类来关联新的子系统对象,同时通过修改配置文件来达到不修改任何源代原创 2012-07-29 00:26:02 · 5308 阅读 · 3 评论 -
外观模式及其改进(一):外观模式概述
外观模式是使用频率最高的结构型设计模式之一,无论是在Web应用软件或是桌面应用软件,还是在移动应用软件中,外观模式都得到了广泛的应用。 外观模式要求外部与一个子系统的通信可以通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的入口,它定义了一个高层接口,这个接口使得相关子系统更加容易使用。如果没有外观角色,每个客户端可能需要和多个子系统之间进行复杂的交互,系统的耦合度将很大,如原创 2012-07-29 00:03:52 · 4952 阅读 · 2 评论 -
外观模式及其改进(三):外观类的单例化
由于外观类维持了对多个子系统类的引用,外观对象在系统运行时将占用较多的系统资源,因此需要对外观对象的数量进行限制,避免系统资源的浪费。可以结合单例模式对外观类进行改进,将外观类设计为一个单例类。通过对外观模式单例化,可以确保系统中只有唯一一个访问子系统的入口,降低系统资源的消耗。单例化之后的外观模式结构如图6所示:图6 单例外观类结构图 在图6中,外观类Facade被设计为单例类,在其原创 2012-07-29 01:43:17 · 4836 阅读 · 4 评论 -
MVC已死?是时候用MOVE了
参考资料:MVC is dead, it's time to MOVE on. http://cirw.in/blog/time-to-move-on 作者:Conrad Irwin — June 2012 MVC模式是一个很了不起的主意,它广泛应用于编程实践中。“数据模型(Model)”可以封装与应用程序的业务逻辑相关的数据及对数据的处理方法;“视图层(View)”能够实现转载 2012-07-29 02:17:16 · 9298 阅读 · 1 评论 -
算法的封装与切换——策略模式(一)
俗话说:条条大路通罗马。在很多情况下,实现某个目标的途径不止一条,例如我们在外出旅游时可以选择多种不同的出行方式,如骑自行车、坐汽车、坐火车或者坐飞机,可根据实际情况(目的地、旅游预算、旅游时间等)来选择一种最适合的出行方式。在制订旅行计划时,如果目的地较远、时间不多,但不差钱,可以选择坐飞机去旅游;如果目的地虽远、但假期长、且需控制旅游成本时可以选择坐火车或汽车;如果从健康和环保的角度考虑,而且原创 2012-08-01 16:14:36 · 26201 阅读 · 11 评论 -
算法的封装与切换——策略模式(二)
24.2 策略模式概述 在策略模式中,我们可以定义一些独立的类来封装不同的算法,每一个类封装一种具体的算法,在这里,每一个封装算法的类我们都可以称之为一种策略(Strategy),为了保证这些策略在使用时具有一致性,一般会提供一个抽象的策略类来做规则的定义,而每种算法则对应于一个具体策略类。 策略模式的主要目的是将算法的定义与使用分开,也就是将算法的行为和环境分开,将算法的定义原创 2012-08-01 16:44:31 · 24215 阅读 · 16 评论 -
算法的封装与切换——策略模式(四)
24.4 策略模式的两个典型应用 策略模式实用性强、扩展性好,在软件开发中得以广泛使用,是使用频率较高的设计模式之一。下面将介绍策略模式的两个典型应用实例,一个来源于Java SE,一个来源于微软公司推出的演示项目PetShop。 (1) Java SE的容器布局管理就是策略模式的一个经典应用实例,其基本结构示意图如图24-3所示:【每次看到这个LayoutManager2接口原创 2012-08-01 17:08:48 · 18263 阅读 · 29 评论 -
树形结构的处理——组合模式(三)
11.3 完整解决方案 为了让系统具有更好的灵活性和可扩展性,客户端可以一致地对待文件和文件夹,Sunny公司开发人员使用组合模式来进行杀毒软件的框架设计,其基本结构如图11-5所示:图11-5 杀毒软件框架设计结构图 在图11-5中, AbstractFile充当抽象构件类,Folder充当容器构件类,ImageFile、TextFile和VideoFile充当叶子构件类。完原创 2012-09-07 23:01:18 · 18498 阅读 · 13 评论 -
树形结构的处理——组合模式(五)
11.5 公司组织结构 在学习和使用组合模式时,Sunny软件公司开发人员发现树形结构其实随处可见,例如Sunny公司的组织结构就是“一棵标准的树”,如图11-8所示:图11-8 Sunny公司组织结构图 在Sunny软件公司的内部办公系统Sunny OA系统中,有一个与公司组织结构对应的树形菜单,行政人员可以给各级单位下发通知,这些单位可以是总公司的一个部门,也可以是一个原创 2012-09-07 23:21:09 · 19126 阅读 · 7 评论 -
树形结构的处理——组合模式(二)
11.2 组合模式概述 对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象)并调用执行,牵一而动百,其中使用了递归调用的机制来对整个结构进行处理。由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中必须有区别地对待容器对象和叶子对象,而实际上大多数情况下我们希望一致地处理它们,因为对于这些对原创 2012-09-07 22:55:34 · 26559 阅读 · 15 评论 -
树形结构的处理——组合模式(四)
11.4 透明组合模式与安全组合模式 通过引入组合模式,Sunny公司设计的杀毒软件具有良好的可扩展性,在增加新的文件类型时,无须修改现有类库代码,只需增加一个新的文件类作为AbstractFile类的子类即可,但是由于在AbstractFile中声明了大量用于管理和访问成员构件的方法,例如add()、remove()等方法,我们不得不在新增的文件类中实现这些方法,提供对应的错误提示和原创 2012-09-07 23:07:46 · 16909 阅读 · 19 评论 -
GRASP模式
GRASP,全称为General Responsibility Assignment Software Pattern,即通用职责分配软件模式,它由《UML和模式应用》(Applying UML and Patterns)一书作者Craig Larman提出。与其将它们称之为设计模式,不如称之为设计原则,因为它是站在面向对象设计的角度,告诉我们怎样设计问题空间中的类与分配它们的行为职责,以及明确类原创 2012-09-16 19:40:41 · 15994 阅读 · 6 评论 -
如何使用C#语言实现原型模式
原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。 《西游记》中,孙悟空可以根据自己的形状复制(克隆)出多个身外身,如图1所示,这种技巧在面向对象软件设计领域被称之为原型模式,孙悟空被称之为原型对象。原型模式通过复制一个原型对象得到多个与原型对象一模一样的新对象。 图1 孙悟空复制身外身 原型模式结构如图2所示: 图2 原型模式结构图原创 2012-10-19 18:37:31 · 6984 阅读 · 8 评论 -
Java动态代理的实现
动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程。 友情提示:本文略有难度,读者需具备代理模式相关基础知识,。 通常情况下,代理模式中的每一个代理类在编译之后都会生成一个class文件,代理类所实现的接口和所代理的方法都被固定,这种代理被称之为静态代理(Static Proxy)。那原创 2012-10-26 19:09:25 · 26409 阅读 · 19 评论 -
C#设计模式之代理模式(一)
代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,所访问的真实对象与代理对象需要实现相同的接口。根据代理模式的使用目的不同,代理模式又可以分为多种类型,例如保护代理、远程代理、虚拟代理、缓冲代理等,它们应用于不同的场合,满足用户的不同需求。 15.1 代理模式概述 近年来,代购已逐步成为电子商务原创 2012-11-26 23:04:10 · 35382 阅读 · 23 评论 -
C#设计模式之代理模式(三)
15.4 远程代理 远程代理(Remote Proxy)是一种常用的代理模式,它使得客户端程序可以访问在远程主机上的对象,远程主机可能具有更好的计算性能与处理速度,可以快速响应并处理客户端的请求。远程代理可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户端完全可以认为被代理的远程业务对象是在本地而不是在远程,而远程代理对象承担了大部分的网络通信工作,并负责对远程业务方法的调用。原创 2012-11-27 00:02:02 · 15663 阅读 · 11 评论 -
C#设计模式之代理模式(二)
15.3 代理模式应用实例 下面通过一个应用实例来进一步学习和理解代理模式。 1. 实例说明 某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需求如下: (1) 在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统; (2) 在进行商务信息查询时系统需要记录查询日志,以便根据查询次数收取原创 2012-11-26 23:28:42 · 21936 阅读 · 20 评论 -
C#设计模式之代理模式(四)
15.7 代理模式效果与适用场景 代理模式是常用的结构型设计模式之一,它为对象的间接访问提供了一个解决方案,可以对对象的访问进行控制。代理模式类型较多,其中远程代理、虚拟代理、保护代理等在软件开发中应用非常广泛。 15.7.1 模式优点 代理模式的共同优点如下: (1) 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。 (2) 客户端可以针原创 2012-11-27 00:22:37 · 16354 阅读 · 10 评论 -
确保对象的唯一性——单例模式 (二)
3.3 负载均衡器的设计与实现 Sunny软件公司承接了一个服务器负载均衡(Load Balance)软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量分发到服务器集群中的多台设备上进行并发处理,提高系统的整体处理能力,缩短响应时间。由于集群中的服务器需要动态删减,且客户端请求需要统一分发,因此需要确保负载均衡器的唯一性,只能有一个负载均衡器来负责服务器的管理和原创 2012-04-02 02:39:07 · 28172 阅读 · 17 评论 -
确保对象的唯一性——单例模式 (五)
3.6 单例模式总结 单例模式作为一种目标明确、结构简单、理解容易的设计模式,在软件开发中使用频率相当高,在很多应用软件和框架中都得以广泛应用。 1.主要优点 单例模式的主要优点如下: (1) 单例模式提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。 (2) 由于在系统内存中只存在一个对象,因此可以原创 2012-04-02 02:56:27 · 22777 阅读 · 28 评论 -
确保对象的唯一性——单例模式 (三)
3.4 饿汉式单例与懒汉式单例的讨论 Sunny公司开发人员使用单例模式实现了负载均衡器的设计,但是在实际使用中出现了一个非常严重的问题,当负载均衡器在启动过程中用户再次启动该负载均衡器时,系统无任何异常,但当客户端提交请求时出现请求分发失败,通过仔细分析发现原来系统中还是存在多个负载均衡器对象,导致分发时目标服务器不一致,从而产生冲突。为什么会这样呢?Sunny公司开发人员百思不得其解原创 2012-04-02 02:46:01 · 30972 阅读 · 37 评论 -
《设计模式的艺术》正式完工
终于借着这个五一小长假,将《设计模式的艺术》一书全部写完了,从去年5月份到今年4月份,前后写了整整一年,经常熬到晚上两三点,头发都白了不少,还常常自嘲式的发出“江郎才尽”的感慨,不过看着近400页的“新作”,还是挺有成就感的。 为了取个好一点的书名,我纠结了很久(因为貌似很多好书名都被大家用完了,),在多位业内朋友的建议下,最终命名为《设计模式的艺术——软件开发人员内功修炼之道》,外加一原创 2012-05-02 00:20:52 · 7136 阅读 · 16 评论 -
如何在类图中标注设计模式(一)
随着设计模式的广泛使用,如何在结构图(主要是UML类图)中标注设计模式成为大家讨论的一个热点话题。设计模式是软件设计中的一些微结构,通过一种合理的方法来标注设计模式既有助于开发人员更好地进行设计软件系统,也有利于理解一些遗留系统,具体来说,设计模式的标注具有以下意义: (1) 在系统设计和实现阶段,如果能够通过一种简单易懂的方式来标注相应的模式角色,将有助于开发人员开发和设计软件时记录所原创 2012-06-01 00:30:11 · 6786 阅读 · 2 评论 -
如何在类图中标注设计模式(二)
接文章《如何在类图中标注设计模式(一)》。本文姗姗来迟,见谅! 5. 基于标记的模式标注 美国德克萨斯大学达拉斯分校的Jing Dong等人提出了一种基于标记的模式标注方法(Tagged Pattern Notation)。该方法通过向原有结构图中附加标记值(Tagged Value)的方式来对模式信息进行标注,每一个类可使用“{pattern[instance]:r原创 2012-12-01 22:38:25 · 5273 阅读 · 3 评论 -
饿汉式单例与懒汉式单例的C#实现
本文将介绍如何使用C#语言实现饿汉式单例与懒汉式单例,并分析饿汉式单例与懒汉式单例的优缺点。 1. 饿汉式单例类 饿汉式单例类(Eager Singleton)是实现起来最容易的单例类,饿汉式单例类结构图如图1所示。图1 饿汉式单例类图 从图1中可以看出,由于在定义静态变量的时候实例化单例类,因此在类加载时单例对象就已创建,代码如下:class EagerSingle原创 2012-12-02 22:21:49 · 8753 阅读 · 5 评论 -
树形结构的处理——组合模式(一)
树形结构在软件中随处可见,例如操作系统中的目录结构、应用软件中的菜单、办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,也可以一致性地处理树形结构中的叶子节点(不包含子节点的节点)和容器节点(包含子节点的节点)。下面将学习这种用于处理树形结构的组合模式。 11.1原创 2012-09-07 22:48:53 · 28575 阅读 · 12 评论 -
设计模式真的能改善软件质量吗?(二)
接前一篇文章: “设计模式真的能改善软件质量吗?(一)”结果分析 选取三个知名的设计模式:组合模式、抽象工厂模式、享元模式 (1) 组合模式 结论:组合模式对大部分质量属性都有正影响,可伸缩性(Scalability)和健壮性(Robustness)除外。 (2) 抽象工厂模式 结论:总体上来说,抽象工厂模式对软件质量属翻译 2012-07-25 00:16:07 · 16120 阅读 · 40 评论