随笔分类 - 设计模式
摘要:模板方法模式应用实例 某软件公司欲为某银行的业务支撑系统开发一个利息计算模块,利息计算流程如下: (1) 系统根据账号和密码验证用户信息,如果用户信息错误,系统显示出错提示; (2) 如果用户信息正确,则根据用户类型的不同使用不同的利息计算公式计算利息(如活期账户和定期账户具有不同的利息计算公式);
阅读全文
摘要:完整解决方案 Sunny软件公司开发人员使用访问者模式对OA系统中员工数据汇总模块进行重构,使得系统可以很方便地增加新类型的访问者,更加符合“单一职责原则”和“开闭原则”,重构后的基本结构如图所示: 在图中,FADepartment表示财务部,HRDepartment表示人力资源部,它们充当具体访问
阅读全文
摘要:完整解决方案 为了实现打折算法的复用,并能够灵活地向系统中增加新的打折方式,Sunny软件公司开发人员使用策略模式对电影院打折方案进行重构,重构后基本结构如图所示: 在图中,MovieTicket充当环境类角色,Discount充当抽象策略角色,StudentDiscount、ChildrenDis
阅读全文
摘要:应用实例 下面通过一个包含循环状态的简单实例来说明如何使用环境类实现状态转换: Sunny软件公司某开发人员欲开发一个屏幕放大镜工具,其具体功能描述如下: 用户单击“放大镜”按钮之后屏幕将放大一倍,再点击一次“放大镜”按钮屏幕再放大一倍,第三次点击该按钮后屏幕将还原到默认大小。 可以考虑使用状态模式
阅读全文
摘要:完整解决方案 为了实现对象之间的联动,Sunny软件公司开发人员决定使用观察者模式来进行多人联机对战游戏的设计,其基本结构如图所示: 在图中,AllyControlCenter充当目标类, ConcreteAllyControlCenter充当具体目标类,Observer充当抽象观察者,Player
阅读全文
摘要:实现多次撤销 Sunny软件公司开发人员通过使用备忘录模式实现了中国象棋棋子的撤销操作,但是使用上述代码只能实现一次撤销,因为在负责人类中只定义一个备忘录对象来保存状态,后面保存的状态会将前一次保存的状态覆盖,但有时候用户需要撤销多步操作。如何实现多次撤销呢? 本节将提供一种多次撤销的解决方案,那就
阅读全文
摘要:完整解决方案 Sunny软件公司CRM系统的客户对“客户信息管理窗口”提出了一个修改意见:要求在窗口的下端能够及时显示当前系统中客户信息的总数。修改之后的界面如图所示: 从图中我们不难发现,可以通过增加一个文本标签(Label)来显示客户信息总数,而且当用户点击“增加”按钮或者“删除”按钮时,将改变
阅读全文
摘要:完整解决方案 为了简化AbstractObjectList类的结构,并给不同的具体数据集合类提供不同的遍历方式, Sunny软件公司开发人员使用迭代器模式来重构AbstractObjectList类的设计,重构之后的销售管理系统数据遍历结构如图所示: (注:为了简化类图和代码,本结构图中只提供一个具
阅读全文
摘要:方案背景 Sunny软件公司开发了一套简单的基于字符界面的格式化指令,可以根据输入的指令在字符界面中输出一些格式化内容,例如输入“LOOP 2 PRINT杨过 SPACE SPACE PRINT 小龙女BREAK END PRINT郭靖 SPACE SPACE PRINT 黄蓉”,将输出如下结果:
阅读全文
摘要:完整案例 Sunny软件公司开发了一个网站配置文件管理工具,可以通过一个可视化界面对网站配置文件进行增删改等操作,该工具使用命令模式进行设计,结构如图所示: 现在Sunny软件公司开发人员希望将对配置文件的操作请求记录在日志文件中,如果网站重新部署,只需要执行保存在日志文件中的命令对象即可修改配置文
阅读全文
摘要:完整解决方案 为了让采购单的审批流程更加灵活,并实现采购单的链式传递和处理,Sunny公司开发人员使用职责链模式来实现采购单的分级审批,其基本结构如图所示: 在图中,抽象类Approver充当抽象处理者(抽象传递者),Director、VicePresident、President和Congress
阅读全文
摘要:代理模式 代理(Proxy)是一种设计模式,提供了间接对目标对象进行访问的方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的功能上,增加额外的功能补充,即扩展目标对象的功能.这就符合了设计模式的开闭原则,即在对既有代码不改动的情况下进行功能的扩展。 举个例子来说明代理的作用:明星
阅读全文
摘要:带外部状态的解决方案 Sunny软件公司开发人员通过对围棋棋子进行进一步分析,发现虽然黑色棋子和白色棋子可以共享,但是它们将显示在棋盘的不同位置,如何让相同的黑子或者白子能够多次重复显示且位于一个棋盘的不同地方?解决方法就是将棋子的位置定义为棋子的一个外部状态,在需要时再进行设置。因此,我们在图中增
阅读全文
摘要:实例说明 某软件公司欲开发一个可应用于多个软件的文件加密模块,该模块可以对文件中的数据进行加密并将加密之后的数据存储在一个新文件中,具体的流程包括三个部分,分别是读取源文件、加密、保存加密之后的文件,其中,读取文件和保存文件使用流来实现,加密操作通过求模运算实现。这三个操作相对独立,为了实现代码的独
阅读全文
摘要:完整解决方案 为了让系统具有更好的灵活性和可扩展性,克服继承复用所带来的问题,Sunny公司开发人员使用装饰模式来重构图形界面构件库的设计,其中部分类的基本结构如图所示: 在图中,Component充当抽象构件类,其子类Window、TextBox、ListBox充当具体构件类,Component类
阅读全文
摘要:完整解决方案 为了让系统具有更好的灵活性和可扩展性,客户端可以一致地对待文件和文件夹,Sunny公司开发人员使用组合模式来进行杀毒软件的框架设计,其基本结构如图所示: 以上是杀毒软件框架设计结构图 在图中, AbstractFile充当抽象构件类,Folder充当容器构件类,ImageFile、Te
阅读全文
摘要:完整解决方案 为了减少所需生成的子类数目,实现将操作系统和图像文件格式两个维度分离,使它们可以独立改变,Sunny公司开发人员使用桥接模式来重构跨平台图像浏览系统的设计,其基本结构如图所示: 在图中,Image充当抽象类,其子类JPGImage、PNGImage、BMPImage和GIFImage充
阅读全文
摘要:完整解决方案 对象适配器: Sunny软件公司开发人员决定使用适配器模式来重用算法库中的算法,其基本结构如图所示: 算法库重用结构图 在图中,ScoreOperation接口充当抽象目标,QuickSort和BinarySearch类充当适配者,OperationAdapter充当适配器。完整代码如
阅读全文
摘要:完整解决方案 Sunny公司开发人员决定使用建造者模式来实现游戏角色的创建,其基本结构如图所示: 图为游戏角色创建结构图 在图中,ActorController充当指挥者,ActorBuilder充当抽象建造者,HeroBuilder、AngelBuilder和DevilBuilder充当具体建造者
阅读全文
摘要:原型管理器的引入和实现 原型管理器(Prototype Manager)是将多个原型对象存储在一个集合中供客户端使用,它是一个专门负责克隆对象的工厂,其中定义了一个集合用于存储原型对象,如果需要某个原型对象的一个克隆,可以通过复制集合中对应的原型对象来获得。在原型管理器中针对抽象原型类进行编程,以便
阅读全文