设计模式
文章平均质量分 84
LoveLion
这个作者很懒,什么都没留下…
展开
-
2012年上半年软件设计师之设计模式相关试题及解答
设计模式已成为软件设计师考试试题的一个重要组成部分,每次考试中都会有将近20分左右的设计模式试题,下面我分析一下最近一次软考(2012年5月)的设计模式试题,希望能够给备考软件设计师的童鞋们提供一点帮助,。 以下试题都来源于2012年5月软件设计师考试真题。 上午试题: ● 面向对象分析与设计中的(37)是指一个模块在扩展性方面应该是开放的,而在更改性方面应原创 2012-10-25 17:33:04 · 8855 阅读 · 12 评论 -
处理对象的多种状态及其相互转换——状态模式(二)
2 状态模式概述 状态模式用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。当系统中某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。状态模式将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象状态可以灵活变化,对于客户端而言,无须关心对象状态的转换以及对象所处的当前状态,无论对于何种状态的对象,客户端都可以一致处原创 2013-01-20 22:43:02 · 17797 阅读 · 15 评论 -
处理对象的多种状态及其相互转换——状态模式(一)
“人有悲欢离合,月有阴晴圆缺”,包括人在内,很多事物都具有多种状态,而且在不同状态下会具有不同的行为,这些状态在特定条件下还将发生相互转换。就像水,它可以凝固成冰,也可以受热蒸发后变成水蒸汽,水可以流动,冰可以雕刻,蒸汽可以扩散。我们可以用UML状态图来描述H2O的三种状态,如图1所示:图1 H2O的三种状态(未考虑临界点) 在软件系统中,有些对象也像水一样具有多种状态,这些状态在某些原创 2013-01-20 22:34:12 · 19827 阅读 · 9 评论 -
处理对象的多种状态及其相互转换——状态模式(三)
3 完整解决方案 Sunny软件公司开发人员使用状态模式来解决账户状态的转换问题,客户端只需要执行简单的存款和取款操作,系统根据余额将自动转换到相应的状态,其基本结构如图4所示:图4 银行账户结构图 在图4中,Account充当环境类角色,AccountState充当抽象状态角色,NormalState、OverdraftState和RestrictedState充当具体状原创 2013-01-20 22:50:29 · 14206 阅读 · 12 评论 -
不兼容结构的协调——适配器模式(一)
我的笔记本电脑的工作电压是20V,而我国的家庭用电是220V,如何让20V的笔记本电脑能够在220V的电压下工作?答案是引入一个电源适配器(AC Adapter),俗称充电器或变压器,有了这个电源适配器,生活用电和笔记本电脑即可兼容,如图9-1所示:图9-1 电源适配器示意图 在软件开发中,有时也存在类似这种不兼容的情况,我们也可以像引入一个电源适配器一样引入一个称之为适配器的角色来协调原创 2013-02-28 23:47:09 · 42105 阅读 · 30 评论 -
不兼容结构的协调——适配器模式(二)
9.3 完整解决方案 Sunny软件公司开发人员决定使用适配器模式来重用算法库中的算法,其基本结构如图9-4所示:图9-4 算法库重用结构图 在图9-4中,ScoreOperation接口充当抽象目标,QuickSort和BinarySearch类充当适配者,OperationAdapter充当适配器。完整代码如下所示://抽象成绩操作类:目标接口interface Sc原创 2013-03-01 00:31:43 · 30522 阅读 · 34 评论 -
不兼容结构的协调——适配器模式(四)
9.6 缺省适配器 缺省适配器模式是适配器模式的一种变体,其应用也较为广泛。缺省适配器模式的定义如下:缺省适配器模式(Default Adapter Pattern):当不需要实现一个接口所提供的所有方法时,可先设计一个抽象类实现该接口,并为接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可以选择性地覆盖父类的某些方法来实现需求,它适用于不想使用一个接口中的所原创 2013-03-01 09:23:35 · 24028 阅读 · 14 评论 -
不兼容结构的协调——适配器模式(三)
9.4 类适配器 除了对象适配器模式之外,适配器模式还有一种形式,那就是类适配器模式,类适配器模式和对象适配器模式最大的区别在于适配器和适配者之间的关系不同,对象适配器模式中适配器和适配者之间是关联关系,而类适配器模式中适配器和适配者是继承关系,类适配器模式结构如图9-5所示:图 9-5 类适配器模式结构图 根据类适配器模式结构图,适配器类实现了抽象目标类接口Target,...原创 2013-03-01 09:07:36 · 30295 阅读 · 17 评论 -
设计模式综合实例分析之数据库同步系统(二)
接“设计模式综合实例分析之数据库同步系统(一)“。 3. 享元模式和单例模式 在数据库同步系统中,抽象类DBObjectSynchronizer表示需要同步的数据库对象,对于不同的数据库对象类型,提供了不同的子类实现,在数据库同步时可能有多个线程在同时进行同步工作,为了节省系统资源,可以使用享元模式来共享DBObjectSynchroizer对象,提供了享元工厂类DBO原创 2013-03-14 09:47:25 · 11559 阅读 · 4 评论 -
设计模式综合实例分析之数据库同步系统(一)
最近有很多朋友跟我聊到关于“在软件项目开发中如何合理使用设计模式”的问题,希望我能够给出一些相对比较完整的真实项目实例,为了满足大家的要求,在后续文章中,我将拿出几个较为复杂的实例与大家一起分享,有些项目是我参与开发的,有些项目是在我的指导下开发的,希望能给大家带来帮助!在此我也希望大家能够分享自己的一些设计模式使用心得和好的设计模式应用实例,可以整理一份给我(可发送到邮箱:weiliu_chin原创 2013-03-14 01:00:46 · 28065 阅读 · 14 评论 -
设计模式与软考试题之桥接模式
2009年上半年软件设计师考试下午试题最后一题考查桥接模式,原题如下: 【全国计算机技术与软件专业技术资格(水平)考试 2009年上半年 软件设计师 下午试卷】 注:当年试题五、试题六和试题七三选一,试题六为C++版,试题七为Java版。 试题六 阅读以下说明和 C++代码,将应填入 (n) 处的字句写在答题纸的对应栏内。 【说明】 现欲实现一个图原创 2013-03-02 20:29:52 · 11644 阅读 · 5 评论 -
设计模式综合实例分析之数据库同步系统(三)
接“设计模式综合实例分析之数据库同步系统(二)“。 6. 策略模式 由于表数据的同步方式有三种,分别是增量同步、先Delete后Insert方式、临时表方式,因此可以定义一个同步策略接口DataSynStrategy,并提供三个具体实现类:IncSynStrategy、DelAndInsSynStrategy和TempTableSynStrategy。类图如图8所示:图原创 2013-03-14 10:00:31 · 11995 阅读 · 3 评论 -
JDK中的设计模式应用实例
在JDK(Java Development Kit)类库中,开发人员使用了大量设计模式,正因为如此,我们可以在不修改JDK源码的前提下开发出自己的应用软件,本文列出了部分JDK中的模式应用实例,有兴趣的童鞋可以深入研究,看看前Sun公司的开发人员是如何在实际框架开发中运用设计模式的,,Sunny认为,研究JDK类库中的模式实例也不失为学习如何使用设计模式的一个好方式,。 创建型模式:(1) 抽象工转载 2013-04-06 21:32:55 · 12055 阅读 · 3 评论 -
请求发送者与接收者解耦——命令模式(二)
3 完整解决方案 为了降低功能键与功能处理类之间的耦合度,让用户可以自定义每一个功能键的功能,Sunny软件公司开发人员使用命令模式来设计“自定义功能键”模块,其核心结构如图4所示: 图4 自定义功能键核心结构图 在图4中,FBSettingWindow是“功能键设置”界面类,FunctionButton充当请求调用者,Command充当抽象命令类,MinimizeComm原创 2013-04-15 21:52:14 · 19145 阅读 · 11 评论 -
请求发送者与接收者解耦——命令模式(四)
5 撤销操作的实现 在命令模式中,我们可以通过调用一个命令对象的execute()方法来实现对请求的处理,如果需要撤销(Undo)请求,可通过在命令类中增加一个逆向操作来实现。扩展除了通过一个逆向操作来实现撤销(Undo)外,还可以通过保存对象的历史状态来实现撤销,后者可使用备忘录模式(Memento Pattern)来实现。 下面通过一个简单的实例来学习如何使用命令模式实原创 2013-04-15 23:21:29 · 14305 阅读 · 7 评论 -
请求发送者与接收者解耦——命令模式(一)
装修新房的最后几道工序之一是安装插座和开关,通过开关可以控制一些电器的打开和关闭,例如电灯或者排气扇。在购买开关时,我们并不知道它将来到底用于控制什么电器,也就是说,开关与电灯、排气扇并无直接关系,一个开关在安装之后可能用来控制电灯,也可能用来控制排气扇或者其他电器设备。开关与电器之间通过电线建立连接,如果开关打开,则电线通电,电器工作;反之,开关关闭,电线断电,电器停止工作。相同的开关可以通过不原创 2013-04-15 21:39:01 · 29389 阅读 · 16 评论 -
请求发送者与接收者解耦——命令模式(五)
6 请求日志 请求日志就是将请求的历史记录保存下来,通常以日志文件(Log File)的形式永久存储在计算机中。很多系统都提供了日志文件,例如Windows日志文件、Oracle日志文件等,日志文件可以记录用户对系统的一些操作(例如对数据的更改)。请求日志文件可以实现很多功能,常用功能如下: (1) “天有不测风云”,一旦系统发生故障,日志文件可以为系统提供一种恢复机制,在原创 2013-04-15 23:42:44 · 13785 阅读 · 10 评论 -
请求发送者与接收者解耦——命令模式(六)
7 宏命令 宏命令(Macro Command)又称为组合命令,它是组合模式和命令模式联用的产物。宏命令是一个具体命令类,它拥有一个集合属性,在该集合中包含了对其他命令对象的引用。通常宏命令不直接与请求接收者交互,而是通过它的成员来调用接收者的方法。当调用宏命令的execute()方法时,将递归调用它所包含的每个成员命令的execute()方法,一个宏命令的成员可以是简单命令,还可以继原创 2013-04-15 23:52:29 · 14813 阅读 · 16 评论 -
《设计模式的艺术——软件开发人员内功修炼之道》交流贴
《设计模式的艺术——软件开发人员内功修炼之道》一书正式出版发行,已在国内各大知名电子商务网站陆续上架。 当当网 亚马逊 京东网 在本书的作者简介和前言中,我都加上了CSDN技术博客的地址,如下图所示,,以供大家学习和讨论之需。这篇博客将一直置顶,如果大家在学习过程中有什么问题,或者对本书有什么意见和建议,都可以通过本博客来进行交原创 2013-01-07 17:55:20 · 13259 阅读 · 31 评论 -
《设计模式实训教程》前言
今天下午收到了清华大学出版社的《设计模式实训教程》,终于出版了,,出版时间为2012年1月,这本书作为《设计模式》的配套教程,融合了我近几年收集到的设计模式实例,还编制了大量设计模式练习题,应该说是国内第一本全面的设计模式习题集和实训手册。以下是本书的前言部分: 随着面向对象技术的发展和广泛应用,设计模式已成为面向对象开发人员的必备技能之一。无论是面向对象的初学者还是具有一定开发经验的原创 2012-02-11 19:53:45 · 11304 阅读 · 5 评论 -
2012年下半年软件设计师之设计模式相关试题及解答
2012年下半年(11月份)软考软件设计师级别考试一共有三道与设计模式相关的试题(共19分),其中上午填空题两道(4分),下午试题一道(15分)。试题及分析如下: 上午试题: ● 每种设计模式都有特定的意图,(44)模式使得一个对象在其内部状态改变时通过调用另一个类中的方法改变其行为,使这个对象看起来如同修改了它的类。下图是采用该模式的有关TCP连接的结构图实例。该模式的核心原创 2013-07-08 21:52:01 · 8017 阅读 · 7 评论 -
《C#设计模式》前言
昨日收到清华大学出版社寄来的《C#设计模式》样书,本书在之前几本Java版的设计模式书籍的基础上又补充了不少内容,并配有大量的实例和习题,还赠送设计模式综合测试题两套,,希望能够给C#开发人员和一些高校师生带来帮助,。 以下是本书的前言部分: 前 言 设计模式和敏捷开发方法的创始人之一Erich Gamma曾说过:“设计和开发面向对象软件是非常困难的原创 2013-05-09 23:19:03 · 8866 阅读 · 3 评论 -
《C#设计模式》PPT及源码分享
《C#设计模式》一书所有PPT及源码已上传至百度文库和百度云网盘,欢迎各位阅读与下载,如有意见和建议,请发送邮件至:weiliu_china@126.com或weiliu_china@163.com,。 PS:本人正准备编写一本关于C++设计模式的书,如果大家有好的基于C++的模式应用实例或者建议,也可以给我发送邮件! 第1章 设计模式概述 http://wenku.ba原创 2013-06-22 00:12:13 · 20041 阅读 · 10 评论 -
2013年上半年软件设计师之设计模式相关试题及解答
2013年上半年(5月份)软考软件设计师级别考试中,与设计模式相关的试题共19分,其中上午填空题4分,下午试题15分。试题及分析如下: 上午试题: ● (44)设计模式能使一个对象的状态发生改变时通知所有依赖它的监听者。(45)设计模式限制类的实例对象只能有一个。适配器(Adapter)设计模式可以用于(46)。用于为一个对象添加更多功能而不使用子类的是(47)设计模式。原创 2013-07-09 20:04:41 · 12084 阅读 · 18 评论 -
工厂三兄弟之简单工厂模式(三)
3 完整解决方案 为了将Chart类的职责分离,同时将Chart对象的创建和使用分离,Sunny软件公司开发人员决定使用简单工厂模式对图表库进行重构,重构后的结构如图2所示:图2 图表库结构图 在图2中,Chart接口充当抽象产品类,其子类HistogramChart、PieChart和LineChart充当具体产品类,ChartFactory充当工厂类。完整代码如下所示:原创 2013-07-11 14:47:31 · 37098 阅读 · 29 评论 -
工厂三兄弟之简单工厂模式(四)
4 方案的改进 Sunny软件公司开发人员发现在创建具体Chart对象时,每更换一个Chart对象都需要修改客户端代码中静态工厂方法的参数,客户端代码将要重新编译,这对于客户端而言,违反了“开闭原则”,有没有一种方法能够在不修改客户端代码的前提下更换具体产品对象呢?答案是肯定的,下面将介绍一种常用的实现方式。 我们可以将静态工厂方法的参数存储在XML或properties格原创 2013-07-11 14:55:44 · 37861 阅读 · 35 评论 -
工厂三兄弟之工厂方法模式(三)
3 完整解决方案 Sunny公司开发人员决定使用工厂方法模式来设计日志记录器,其基本结构如图3所示:图3 日志记录器结构图 在图3中,Logger接口充当抽象产品,其子类FileLogger和DatabaseLogger充当具体产品,LoggerFactory接口充当抽象工厂,其子类FileLoggerFactory和DatabaseLoggerFactory充当具体工厂原创 2013-07-12 10:35:24 · 40530 阅读 · 43 评论 -
工厂三兄弟之工厂方法模式(一)
简单工厂模式虽然简单,但存在一个很严重的问题。当系统中需要引入新产品时,由于静态工厂方法通过所传入参数的不同来创建不同的产品,这必定要修改工厂类的源代码,将违背“开闭原则”,如何实现增加新产品而不影响已有代码?工厂方法模式为此应运而生,本文将介绍第二种工厂模式——工厂方法模式。 1 日志记录器的设计 Sunny软件公司欲开发一个系统运行日志记录器(Logger),该记录器可以通过多种途原创 2013-07-12 09:45:34 · 46304 阅读 · 21 评论 -
工厂三兄弟之工厂方法模式(四)
5 重载的工厂方法 Sunny公司开发人员通过进一步分析,发现可以通过多种方式来初始化日志记录器,例如可以为各种日志记录器提供默认实现;还可以为数据库日志记录器提供数据库连接字符串,为文件日志记录器提供文件路径;也可以将参数封装在一个Object类型的对象中,通过Object对象将配置参数传入工厂类。此时,可以提供一组重载的工厂方法,以不同的方式对产品对象进行创建。当然,对于同一个具体原创 2013-07-12 11:00:25 · 32528 阅读 · 20 评论 -
工厂三兄弟之工厂方法模式(二)
2 工厂方法模式概述 在简单工厂模式中只提供一个工厂类,该工厂类处于对产品类进行实例化的中心位置,它需要知道每一个产品对象的创建细节,并决定何时实例化哪一个产品类。简单工厂模式最大的缺点是当有新产品要加入到系统中时,必须修改工厂类,需要在其中加入必要的业务逻辑,这违背了“开闭原则”。此外,在简单工厂模式中,所有的产品都由同一个工厂创建,工厂类职责较重,业务逻辑较为复杂,具体产品与工厂类原创 2013-07-12 10:13:01 · 42759 阅读 · 30 评论 -
工厂三兄弟之简单工厂模式(一)
工厂模式是最常用的一类创建型设计模式,通常我们所说的工厂模式是指工厂方法模式,它也是使用频率最高的工厂模式。本章将要学习的简单工厂模式是工厂方法模式的“小弟”,它不属于GoF 23种设计模式,但在软件开发中应用也较为频繁,通常将它作为学习其他工厂模式的入门。此外,工厂方法模式还有一位“大哥”——抽象工厂模式。这三种工厂模式各具特色,难度也逐个加大,在软件开发中它们都得到了广泛的应用,成为面向对象软原创 2013-07-11 14:24:40 · 65701 阅读 · 24 评论 -
工厂三兄弟之抽象工厂模式(一)
工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问题,但由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系统的开销。此时,我们可以考虑将一些相关的产品组成一个“产品族”,由同一个工厂来统一生产,这就是我们本文将要学习的抽象工厂模式的基本思想。1 界面皮肤库的初始设计 Sunny软件公司欲开发一套界面皮肤库,可以对Java桌面原创 2013-07-13 16:17:57 · 38786 阅读 · 22 评论 -
工厂三兄弟之抽象工厂模式(二)
2 产品等级结构与产品族 在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法具有唯一性,一般情况下,一个具体工厂中只有一个或者一组重载的工厂方法。但是有时候我们希望一个工厂可以提供多个产品对象,而不是单一的产品对象,如一个电器工厂,它可以生产电视机、电冰箱、空调等多种电器,而不是只生产某一种电器。为了更好地理解抽象工厂模式,我们先引入两个概念:原创 2013-07-13 16:34:27 · 32810 阅读 · 19 评论 -
工厂三兄弟之抽象工厂模式(三)
3 抽象工厂模式概述 抽象工厂模式为创建一组对象提供了一种解决方案。与工厂方法模式相比,抽象工厂模式中的具体工厂不只是创建一种产品,它负责创建一族产品。抽象工厂模式定义如下: 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。原创 2013-07-13 16:40:12 · 34597 阅读 · 44 评论 -
工厂三兄弟之抽象工厂模式(四)
4 完整解决方案 Sunny公司开发人员使用抽象工厂模式来重构界面皮肤库的设计,其基本结构如图6所示:图6 界面皮肤库结构图 在图6中,SkinFactory接口充当抽象工厂,其子类SpringSkinFactory和SummerSkinFactory充当具体工厂,接口Button、TextField和ComboBox充当抽象产品,其子类SpringButton、Sprin原创 2013-07-13 16:47:52 · 31852 阅读 · 24 评论 -
工厂三兄弟之抽象工厂模式(五)
5 “开闭原则”的倾斜性 Sunny公司使用抽象工厂模式设计了界面皮肤库,该皮肤库可以较为方便地增加新的皮肤,但是现在遇到一个非常严重的问题:由于设计时考虑不全面,忘记为单选按钮(RadioButton)提供不同皮肤的风格化显示,导致无论选择哪种皮肤,单选按钮都显得那么“格格不入”。Sunny公司的设计人员决定向系统中增加单选按钮,但是发现原有系统居然不能够在符合“开闭原则”的前提下增原创 2013-07-13 16:58:07 · 26654 阅读 · 29 评论 -
从招式与内功谈起——设计模式概述(二)
1.2 设计模式是什么 俗话说:站在别人的肩膀上,我们会看得更远。设计模式的出现可以让我们站在前人的肩膀上,通过一些成熟的设计方案来指导新项目的开发和设计,以便于我们开发出具有更好的灵活性和可扩展性,也更易于复用的软件系统。 设计模式的一般定义如下:设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代原创 2012-04-02 01:40:51 · 44812 阅读 · 39 评论 -
从招式与内功谈起——设计模式概述(三)
1.3 设计模式有什么用 下面我们来回答最后一个问题:设计模式到底有什么用?简单来说,设计模式至少有如下几个用途: (1) 设计模式来源众多专家的经验和智慧,它们是从许多优秀的软件系统中总结出的成功的、能够实现可维护性复用的设计方案,使用这些方案将可以让我们避免做一些重复性的工作,也许我们冥思苦想得到的一个“自以为很了不起”的设计方案其实就是某一个设计模式。在时间就是金原创 2012-04-02 01:51:38 · 74050 阅读 · 47 评论 -
请求发送者与接收者解耦——命令模式(三)
4 命令队列的实现 有时候我们需要将多个请求排队,当一个请求发送者发送一个请求时,将不止一个请求接收者产生响应,这些请求接收者将逐个执行业务方法,完成对请求的处理。此时,我们可以通过命令队列来实现。 命令队列的实现方法有多种形式,其中最常用、灵活性最好的一种方式是增加一个CommandQueue类,由该类来负责存储多个命令对象,而不同的命令对象可以对应不同的请求接收者,Co原创 2013-04-15 22:31:50 · 15449 阅读 · 8 评论 -
遍历聚合对象中的元素——迭代器模式(三)
3 完整解决方案 为了简化AbstractObjectList类的结构,并给不同的具体数据集合类提供不同的遍历方式,Sunny软件公司开发人员使用迭代器模式来重构AbstractObjectList类的设计,重构之后的销售管理系统数据遍历结构如图4所示:图4 销售管理系统数据遍历结构图(注:为了简化类图和代码,本结构图中只提供一个具体聚合类和具体迭代器类) 在图4中,Abs原创 2013-08-15 23:23:43 · 15844 阅读 · 16 评论