自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

刘伟技术博客

专注软件架构、设计模式、重构、UML和OOAD!

  • 博客(36)
  • 收藏
  • 关注

原创 创建对象与使用对象——谈谈工厂的作用

在设计模式的教学和推广过程中,很多企业学员和在校学生经常问我,工厂模式(包括简单工厂模式、工厂方法模式和抽象工厂模式)到底有什么用,很多时候通过反射机制就可以很灵活地创建对象,为毛还要工厂?,在本文中我将围绕创建对象和使用对象来简单谈谈工厂的作用。      与一个对象相关的职责通常有三类:对象本身所具有的职责、创建对象的职责和使用对象的职责。对象本身的职责比较容易理解,就是对象自身所具有的一些数

2012-04-30 01:54:54 48470 27

原创 处理多维度变化——桥接模式(四)

10.4 适配器模式与桥接模式的联用        在软件开发中,适配器模式通常可以与桥接模式联合使用。适配器模式可以解决两个已有接口间不兼容问题,在这种情况下被适配的类往往是一个黑盒子,有时候我们不想也不能改变这个被适配的类,也不能控制其扩展。适配器模式通常用于现有系统与第三方产品功能的集成,采用增加适配器的方式将第三方类集成到系统中。桥接模式则不同,用户可以通过接口继承或类继承的方式来对系

2012-04-16 00:22:58 20908 18

原创 处理多维度变化——桥接模式(三)

10.3  完整解决方案        为了减少所需生成的子类数目,实现将操作系统和图像文件格式两个维度分离,使它们可以独立改变,Sunny公司开发人员使用桥接模式来重构跨平台图像浏览系统的设计,其基本结构如图10-5所示:         在图10-5中,Image充当抽象类,其子类JPGImage、PNGImage、BMPImage和GIFImage充当扩充抽象类;ImageImp

2012-04-16 00:15:41 22849 10

原创 处理多维度变化——桥接模式(二)

10.2 桥接模式概述        桥接模式是一种很实用的结构型设计模式,如果软件系统中某个类存在两个独立变化的维度,通过该模式可以将这两个维度分离出来,使两者可以独立扩展,让系统更加符合“单一职责原则”。与多层继承方案不同,它将两个独立变化的维度设计为两个独立的继承等级结构,并且在抽象层建立一个抽象关联,该关联关系类似一条连接两个独立继承结构的桥,故名桥接模式。        桥接模式

2012-04-16 00:07:09 29523 19

原创 处理多维度变化——桥接模式(一)

在正式介绍桥接模式之前,我先跟大家谈谈两种常见文具的区别,它们是毛笔和蜡笔。假如我们需要大中小3种型号的画笔,能够绘制12种不同的颜色,如果使用蜡笔,需要准备3×12 = 36支,但如果使用毛笔的话,只需要提供3种型号的毛笔,外加12个颜料盒即可,涉及到的对象个数仅为 3 + 12 = 15,远小于36,却能实现与36支蜡笔同样的功能。如果增加一种新型号的画笔,并且也需要具有12种颜色,对

2012-04-15 23:56:32 29463 18

原创 操作复杂对象结构——访问者模式(四)

26.4 访问者模式与组合模式联用      在访问者模式中,包含一个用于存储元素对象集合的对象结构,我们通常可以使用迭代器来遍历对象结构,同时具体元素之间可以存在整体与部分关系,有些元素作为容器对象,有些元素作为成员对象,可以使用组合模式来组织元素。引入组合模式后的访问者模式结构图如图26-4所示:         需要注意的是,在图26-4所示结构中,由于叶子元素的遍历操作已经

2012-04-06 20:20:58 10872 13

原创 操作复杂对象结构——访问者模式(三)

26.3 完整解决方案      Sunny软件公司开发人员使用访问者模式对OA系统中员工数据汇总模块进行重构,使得系统可以很方便地增加新类型的访问者,更加符合“单一职责原则”和“开闭原则”,重构后的基本结构如图26-3所示:       在图26-3中,FADepartment表示财务部,HRDepartment表示人力资源部,它们充当具体访问者角色,其抽象父类Department充

2012-04-06 20:15:05 12371 11

原创 操作复杂对象结构——访问者模式(二)

26.2 访问者模式概述      访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作。例如处方单中的各种药品信息就是被访问的元素,而划价人员和药房工作人员就是访问者。访问者模式使得用户可以在不修改现有系统的情况下扩展系统的功能,为这些不同类型的元素增加新的操作。      在使

2012-04-06 20:07:28 15004 9

原创 操作复杂对象结构——访问者模式(一)

想必大家都去过医院,虽然没有人喜欢去医院(爱岗敬业的医务工作人员除外,)。在医生开具处方单(药单)后,很多医院都存在如下处理流程:划价人员拿到处方单之后根据药品名称和数量计算总价,药房工作人员根据药品名称和数量准备药品,如图26-1所示:      在图26-1中,我们可以将处方单看成一个药品信息的集合,里面包含了一种或多种不同类型的药品信息,不同类型的工作人员(如划价人员和药房工作人员)在操作同

2012-04-06 19:58:03 18827 8

原创 设计模式面试与笔试题剖析(三)

Windows Media Player和RealPlayer是两种常用的媒体播放器,它们的API结构和调用方法存在区别。现在你的应用程序需要支持这两种播放器API,而且在将来可能还需要支持新的媒体播放器,请问如何设计该应用程序?       参考解答:【个人观点】      本题可使用适配器模式和抽象工厂模式,参考类图如下所示:      在该类图中,我们为两

2012-04-05 23:35:44 11079 1

原创 设计模式面试与笔试题剖析(二)

某知名IT企业笔试题: 程序设计:猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。要求:(1) 要有联动性,老鼠和主人的行为是被动的;(2) 考虑可扩展性,猫的叫声可能引起其他联动效应。       参考解答:【个人观点】      本题可使用观察者模式,参考类图如下所示:      参考代码如下: import

2012-04-05 23:20:37 8191 1

原创 设计模式面试与笔试题剖析(一)

近几年来,设计模式试题已广泛出现在一些IT企业(包括一些巨牛型企业)的面试和笔试题中,从本文开始我将通过几篇文章来介绍一下一些已出现过的设计模式面试和笔试题,欢迎大家讨论。某房地产公司欲开发一套房产信息管理系统,根据如下描述选择合适的设计模式进行设计:(1) 该公司有多种房型,如公寓、别墅等,在将来可能会增加新的房型;(2) 销售人员每售出一套房子,主管将收到相

2012-04-05 23:11:39 20389 2

原创 设计模式之反射与配置文件

为了满足“开闭原则”,大部分设计模式都引入了抽象层,如工厂方法模式、抽象工厂模式、适配器模式、桥接模式、命令模式、策略模式等等。客户端代码针对抽象层编程,而在程序运行的时候再指定其子类,根据“里氏代换原则”和面向对象的多态性,子类对象在运行时将覆盖父类对象。如果需要对系统进行扩展或修改,只需修改子类类名即可。在具体实现时,通过引入配置文件可以使得用户在不修改任何客户端代码的前提下增加或替换子类,其

2012-04-05 22:47:30 13538 9

原创 复杂对象的组装与创建——建造者模式(三)

8.4 关于Director的进一步讨论       指挥者类Director在建造者模式中扮演非常重要的作用,简单的Director类用于指导具体建造者如何构建产品,它按一定次序调用Builder的buildPartX()方法,控制调用的先后次序,并向客户端返回一个完整的产品对象。下面我们讨论几种Director的高级应用方式:       1.省略Director      在

2012-04-04 23:26:00 21359 25

原创 复杂对象的组装与创建——建造者模式(二)

8.3完整解决方案      Sunny公司开发人员决定使用建造者模式来实现游戏角色的创建,其基本结构如图8-3所示:图8-3 游戏角色创建结构图      在图8-3中,ActorController充当指挥者,ActorBuilder充当抽象建造者,HeroBuilder、AngelBuilder和DevilBuilder充当具体建造者,Actor充当复杂产品。完整代码如下

2012-04-04 20:04:21 22107 22

原创 复杂对象的组装与创建——建造者模式(一)

没有人买车会只买一个轮胎或者方向盘,大家买的都是一辆包含轮胎、方向盘和发动机等多个部件的完整汽车。如何将这些部件组装成一辆完整的汽车并返回给用户,这是建造者模式需要解决的问题。建造者模式又称为生成器模式,它是一种较为复杂、使用频率也相对较低的创建型模式。建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品。8.1 游戏角色设计Sunny软件公司游戏开

2012-04-04 17:35:53 42612 29

原创 扩展系统功能——装饰模式(四)

12.4 透明装饰模式与半透明装饰模式      装饰模式虽好,但存在一个问题。如果客户端希望单独调用具体装饰类新增的方法,而不想通过抽象构件中声明的方法来调用新增方法时将遇到一些麻烦,我们通过一个实例来对这种情况加以说明:在Sunny软件公司开发的Sunny OA系统中,采购单(PurchaseRequest)和请假条(LeaveRequest)等文件(Documen

2012-04-04 16:40:13 17638 39

原创 扩展系统功能——装饰模式(三)

12.3 完整解决方案       为了让系统具有更好的灵活性和可扩展性,克服继承复用所带来的问题,Sunny公司开发人员使用装饰模式来重构图形界面构件库的设计,其中部分类的基本结构如图12-4所示:图12-4 图形界面构件库结构图      在图12-4中,Component充当抽象构件类,其子类Window、TextBox、ListBox充当具体构件类,Component类

2012-04-04 16:30:38 18441 19

原创 扩展系统功能——装饰模式(二)

12.2 装饰模式概述      装饰模式可以在不改变一个对象本身功能的基础上给对象增加额外的新行为,在现实生活中,这种情况也到处存在,例如一张照片,我们可以不改变照片本身,给它增加一个相框,使得它具有防潮的功能,而且用户可以根据需要给它增加不同类型的相框,甚至可以在一个小相框的外面再套一个大相框。      装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式来给对象动态增加职

2012-04-04 16:26:48 24277 19

原创 扩展系统功能——装饰模式(一)

尽管目前房价依旧很高,但还是阻止不了大家对新房的渴望和买房的热情。如果大家买的是毛坯房,无疑还有一项艰巨的任务要面对,那就是装修。对新房进行装修并没有改变房屋用于居住的本质,但它可以让房子变得更漂亮、更温馨、更实用、更能满足居家的需求。在软件设计中,我们也有一种类似新房装修的技术可以对已有对象(新房)的功能进行扩展(装修),以获得更加符合用户需求的对象,使得对象具有更加强大的功能。这种技术对应于一

2012-04-03 23:36:05 25670 18

原创 对象的克隆——原型模式(四)

7.5 原型管理器的引入和实现      原型管理器(Prototype Manager)是将多个原型对象存储在一个集合中供客户端使用,它是一个专门负责克隆对象的工厂,其中定义了一个集合用于存储原型对象,如果需要某个原型对象的一个克隆,可以通过复制集合中对应的原型对象来获得。在原型管理器中针对抽象原型类进行编程,以便扩展。其结构如图7-8所示:

2012-04-03 23:07:29 19761 15

原创 对象的克隆——原型模式(三)

7.4 带附件的周报      通过引入原型模式,Sunny软件公司OA系统支持工作周报的快速克隆,极大提高了工作周报的编写效率,受到员工的一致好评。但有员工又发现一个问题,有些工作周报带有附件,例如经理助理“小龙女”的周报通常附有本周项目进展报告汇总表、本周客户反馈信息汇总表等,如果使用上述原型模式来复制周报,周报虽然可以复制,但是周报的附件并不能复制,这是由于什么原因导致的呢?如何才能实现

2012-04-03 22:57:02 20281 19

原创 对象的克隆——原型模式(二)

7.3 完整解决方案      Sunny公司开发人员决定使用原型模式来实现工作周报的快速创建,快速创建工作周报结构图如图7-3所示:图7-3 快速创建工作周报结构图      在图7-3中,WeeklyLog充当具体原型类,Object类充当抽象原型类,clone()方法为原型方法。WeeklyLog类的代码如下所示://工作周报WeeklyLog:具体原型类

2012-04-03 22:46:39 19818 35

原创 对象的克隆——原型模式(一)

张纪中版《西游记》以出乎意料的造型和雷人的台词遭到广大观众朋友的热议,我们在此对该话题不作过多讨论。但无论是哪个版本的《西游记》,孙悟空都是其中的一号雄性主角,关于他(或它)拔毛变小猴的故事几乎人人皆知,孙悟空可以用猴毛根据自己的形象,复制(又称“克隆”或“拷贝”)出很多跟自己长得一模一样的“身外身”来。在设计模式中也存在一个类似的模式,可以通过一个原型对象克隆出多个一模一样的对象,该模式称之为原

2012-04-03 22:43:10 32129 27

原创 请求的链式处理——职责链模式(四)

16.4 纯与不纯的职责链模式      职责链模式可分为纯的职责链模式和不纯的职责链模式两种:        (1) 纯的职责链模式      一个纯的职责链模式要求一个具体处理者对象只能在两个行为中选择一个:要么承担全部责任,要么将责任推给下家,不允许出现某一个具体处理者对象在承担了一部分或全部责任后又将责任向下传递的情况。而且在纯的职责链模式中,要求一个请求必须被某一个处理者对象所接收,不能

2012-04-02 03:22:30 16347 11

原创 请求的链式处理——职责链模式(三)

16.3 完整解决方案      为了让采购单的审批流程更加灵活,并实现采购单的链式传递和处理,Sunny公司开发人员使用职责链模式来实现采购单的分级审批,其基本结构如图16-3所示:       在图16-3中,抽象类Approver充当抽象处理者(抽象传递者),Director、VicePresident、President和Congress充当具体处理者(具体传递者),PurchaseReq

2012-04-02 03:17:34 17247 17

原创 请求的链式处理——职责链模式(二)

16.2 职责链模式概述      很多情况下,在一个软件系统中可以处理某个请求的对象不止一个,例如SCM系统中的采购单审批,主任、副董事长、董事长和董事会都可以处理采购单,他们可以构成一条处理采购单的链式结构,采购单沿着这条链进行传递,这条链就称为职责链。职责链可以是一条直线、一个环或者一个树形结构,最常见的职责链是直线型,即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者,职责链模式

2012-04-02 03:11:30 20067 11

原创 请求的链式处理——职责链模式(一)

“一对二”,“过”,“过”……这声音熟悉吗?你会想到什么?对!纸牌。在类似“斗地主”这样的纸牌游戏中,某人出牌给他的下家,下家看看手中的牌,如果要不起上家的牌则将出牌请求再转发给他的下家,其下家再进行判断。一个循环下来,如果其他人都要不起该牌,则最初的出牌者可以打出新的牌。在这个过程中,牌作为一个请求沿着一条链在传递,每一位纸牌的玩家都可以处理该请求。在设计模式中,我们也有一种专门用于处理这种请求

2012-04-02 03:07:27 22485 8

原创 确保对象的唯一性——单例模式 (五)

3.6 单例模式总结       单例模式作为一种目标明确、结构简单、理解容易的设计模式,在软件开发中使用频率相当高,在很多应用软件和框架中都得以广泛应用。 1.主要优点       单例模式的主要优点如下:       (1) 单例模式提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。       (2) 由于在系统内存中只存在一个对象,因此可以

2012-04-02 02:56:27 22592 28

原创 确保对象的唯一性——单例模式 (四)

3.5 一种更好的单例实现方法       饿汉式单例类不能实现延迟加载,不管将来用不用始终占据内存;懒汉式单例类线程安全控制烦琐,而且性能受影响。可见,无论是饿汉式单例还是懒汉式单例都存在这样那样的问题,有没有一种方法,能够将两种单例的缺点都克服,而将两者的优点合二为一呢?答案是:Yes!下面我们来学习这种更好的被称之为Initializationon Demand Holder (IoDH)的

2012-04-02 02:52:08 35122 39

原创 确保对象的唯一性——单例模式 (三)

3.4 饿汉式单例与懒汉式单例的讨论      Sunny公司开发人员使用单例模式实现了负载均衡器的设计,但是在实际使用中出现了一个非常严重的问题,当负载均衡器在启动过程中用户再次启动该负载均衡器时,系统无任何异常,但当客户端提交请求时出现请求分发失败,通过仔细分析发现原来系统中还是存在多个负载均衡器对象,导致分发时目标服务器不一致,从而产生冲突。为什么会这样呢?Sunny公司开发人员百思不得其解

2012-04-02 02:46:01 30749 37

原创 确保对象的唯一性——单例模式 (二)

3.3 负载均衡器的设计与实现       Sunny软件公司承接了一个服务器负载均衡(Load Balance)软件的开发工作,该软件运行在一台负载均衡服务器上,可以将并发访问和数据流量分发到服务器集群中的多台设备上进行并发处理,提高系统的整体处理能力,缩短响应时间。由于集群中的服务器需要动态删减,且客户端请求需要统一分发,因此需要确保负载均衡器的唯一性,只能有一个负载均衡器来负责服务器的管理和

2012-04-02 02:39:07 27951 17

原创 确保对象的唯一性——单例模式 (一)

3.1 单例模式的动机      对于一个软件系统的某些类而言,我们无须创建多个实例。举个大家都熟知的例子——Windows任务管理器,如图3-1所示,我们可以做一个这样的尝试,在Windows的“任务栏”的右键弹出菜单上多次点击“启动任务管理器”,看能否打开多个任务管理器窗口?如果你的桌面出现多个任务管理器,我请你吃饭,(注:电脑中毒或私自修改Windows内核者除外)。通常情况下,无论我们启动

2012-04-02 02:30:47 43120 50

原创 从招式与内功谈起——设计模式概述(三)

1.3 设计模式有什么用      下面我们来回答最后一个问题:设计模式到底有什么用?简单来说,设计模式至少有如下几个用途:      (1) 设计模式来源众多专家的经验和智慧,它们是从许多优秀的软件系统中总结出的成功的、能够实现可维护性复用的设计方案,使用这些方案将可以让我们避免做一些重复性的工作,也许我们冥思苦想得到的一个“自以为很了不起”的设计方案其实就是某一个设计模式。在时间就是金

2012-04-02 01:51:38 72514 47

原创 从招式与内功谈起——设计模式概述(二)

1.2 设计模式是什么       俗话说:站在别人的肩膀上,我们会看得更远。设计模式的出现可以让我们站在前人的肩膀上,通过一些成熟的设计方案来指导新项目的开发和设计,以便于我们开发出具有更好的灵活性和可扩展性,也更易于复用的软件系统。       设计模式的一般定义如下:设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代

2012-04-02 01:40:51 43342 38

原创 从招式与内功谈起——设计模式概述(一)

关于金庸小说中到底是招式重要还是内功重要的争论从未停止,我们在这里并不分析张无忌的九阳神功和令狐冲的独孤九剑到底哪个更厉害,但我想每个武林人士梦寐以求的应该是既有淋漓的招式又有深厚的内功。看到这里大家可能会产生疑问了?搞什么,讨论什么招式与内功,我只是个软件开发人员。别急,正因为你是软件开发人员我才跟你谈这个,因为我们的软件开发技术也包括一些招式和内功:Java、C#、C++等编程语言,Eclip

2012-04-02 01:32:20 84044 60

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除