软件设计模式
设计模式
设计模式在软件开发中的应用
学院:
专业:
学号:
姓名:
2014年1月1日
设计模式在软件开发中的应用
一、设计模式简介
设计模式这个概念最初产生于建筑行业。设计师(设计建筑物而不是计算机系统)意识到他们需要共享有关正确设计技术的想法。这些想法是在可以使设计师团体从 分享经验和教训中获益的设计模式中形成的。设计模式在80年代后期从建筑业进入计算机系统领域。面向对象(Object-oriented,OO)原则逐 渐得到普及,而设计模式成为培育新的OO追随者的最佳实践。
“设计模式”这四个字,相信大家在很多地方都会看到,什么是设计模式呢?一个设计模式是提供一种提炼子系统或软件系统中的组件的,或者它们之间的关系的纲要设计。设计模式描述普遍存在的在相互通讯的组件中重复出现的结构,这种结构解决在一定的背景中的具有一般性的设计问题。
随着面向对象技术的发展和广泛应用,设计模式在软件开发和设计中的重要性不言而喻。作为软 件开发人员,尤其是面向对象软件开发人员,设计模式已成为其内功修炼的重要组成部分之一。无论是面向对象的初学者还是具有一定经验的开发人员,都可以通过 对设计模式的学习和使用来加深对面向对象思想的理解,开发出具有更好的可扩展性和复用性的软件。设计模式是前人经验的积累,它将让软件变得更像一个艺术 品,而不是一堆难以维护和重用的代码。
二、设计模式分类
设计模式常常划分成不同的种类,常见的种类有:
创建型设计模式,如工厂方法(Factory Method)模式、抽象工厂(Abstract Factory)模式、原型(Prototype)模式、单例(Singleton)模式,建造(Builder)模式等。
结构型设计模式,如合成(Composite)模式、装饰(Decorator)模式、代理(Proxy)模式、享元(Flyweight)模式、门面(Facade)模式、桥梁(Bridge)模式等。
行为型模式,如模版方法(Template Method)模式、观察者(Observer)模式、迭代子(Iterator)模式、责任链(Chain of Responsibility)模式、备忘录(Memento)模式、命令(Command)模式、状态(State)模式、访问者(Visitor)模式等等。
以上是三种经典类型,实际上还有很多其他的类型,比如Fundamental型、Partition型,Relation型等等。
三、为什么使用设计模式
对任何设计都可以凭主观(对设计很难做出客观评价)判断得出它是一个好的设计,还是一个坏的设计。使用设计模式是为了避免坏的设计。
Martin在他的著作《敏捷软件开发原则、模式与实践》中描述了拙劣设计的症状:
僵化性(Rigidity):设计难以改变
脆弱性(Fragility):设计易于遭到破坏
牢固性(Immobility):设计难以重用
粘滞性(Viscosity):难以做正确的事情
不必要的复杂性(Needless Complexity):过分设计
不必要的重复(Needless Repetition):过多的重复
晦涩性(Opacity):混乱的表达
四、什么时候使用设计模式
设计模式是为了使设计适应变化;
设计模式是重构的工具;
设计一开始就要保持干净、简单,以后仍然要保持干净、简单;
不能过度使用设计模式。
使用设计模式的目的是为了适应未来的变化,变化之所以存在是因为它的不可预知性——如果可以预知,则不能称其为变化。如何判断哪些需求可能变化,哪些需求可能不变,并且在最大程度上保持设计的干净、简单,这是些工艺问题,而不是工程问题。既然是工艺问题,那么就只能给出原则,不能给出标准。使用设计模式的大体原则可能是:对未来极有可能发生变化的问题给出最简单、修改成本最低的解。
五、设计模式在软件开发中的应用实例
这里通过先通过几个简单例子的说明来介绍在设计模式实际的软件开发中的使用。
1.单例模式(Singleton Pattern)应用实例
struts1中的Action是单例
spring_mvc中的contorller是单例
Window的回收站在整个系统中只有唯一的一个实例,而且回收站自行提供自己的实例,回收站也是单例模式的应用。
对于计算机的外部资源打印机的情况,因只有一个Printer Spooler,为避免两个打印作业同时输出到打印机中,可考虑用单例模式实现。
2.策略模式(Strategy)应用实例
使用QQ聊天时使外挂
图书销售算法(不同书本折扣的算法)
3.原型模式(Prototype) 应用实例
复印技术: 1)不是同一个对象 2)属同类
短消息(转发) 1-n个MM
4.门面模式(Facade) 应用实例
Facade典型应用就是数据库JDBC的应用和Session的应用
5.备忘录模式(Memento)应用实例
备份系统时使用GHOST
在HttpAdmin中,Controller一次可能向Agent提交多个命令,如果因为网络或其它原因导致Provider不能完成这些命 令,Controller就负责将这些命令信息(主要是命令参数和当前命令的执行状态)保存到磁盘文件上,等Controller下次启动时加载这个信息文件,使得所有的命令能够恢复到上次的状态,由用户选择是否继续执行这些命令。这样的设计涉及到对CControlCommand类的信息的访问,但是 CControlCommand类的一些参数信息和状态信息是内部私有的,如果提供对这些参数的访问方法将破坏CControlCommand类的封装性。既要能够保存和恢复CControlCommand类的状态,又不能对CControlCommand类的设计做太大的改变,以至于要以破坏数据封装为代价,那么使用备忘录模式就是最好的选择了,本章将结合上面提到的例子介绍一个备忘录模式的应用实例。
6.命令模式(Command)应用实例
上网 IE 输入 http地址发送命令
在HttpAdmin的设计中,Controller向Agent提交命令是通过用户的界面操作实现的,用户使用界面上菜单、工具栏或命令行输入接口输入 一个命令以及命令需要的参数,然后Controller负责触发相应的命令处理类完成命令的处理过程。从接收命令参数到触发相应的命令类处理过程,我们设 计使用了命令模式。使用命令模式,不尽省去了使用回调函数的烦恼,还使得系统具有了更好的可扩展性。比如,我们的系统就可以利用Windows的多线程机 制加快命令执行的过程,将下载一个文件夹的命令(Command)委托给若干个下载单个文件的命令(Command)。
7. 解释器(Interpreter) 应用实例
编译原理之编译器
文言文注释:一段文言文,将它翻译成白话文
8.调停者模式(Mediator) 应用实例
法院和原告,被告的关系
9.责任链模式(Chain of Responsibility) 应用实例
喝酒时通过成语接龙决定谁喝酒(马到成功-功不可没-没完没了)
10.工厂模式(Factory)应用实例
struts2中的Action
水果园—〉(葡萄园,苹果园)--〉(葡萄,苹果)(各自生产)
11.抽象工厂模式(Abstract Factory)应用实例
女娲造人---〉(阴,阳)--〉(人,兽)----〉(男人,女人,公兽,母兽)(人和兽属于不同的产品类)
12.建造模式(Builder)应用实例
汽车制造
13.合成模式(Composite)应用实例
windows的目录树(文件系统)
14.装饰模式(Decorator)应用实例
使用License文件是软件加密的一种方式,我们的个人计算机信息管理软件“SysAdmin”使用CLicenseFile类处理对License文 件的检查,处理过程中需要对文件进行CRC校验,RSA数字签名和统计MD5摘要,这个小系统使用了Decorator模式。
15. 适配器 (Adapter) 应用实例
日志框架中 slf4j-log4j12-1.5.8.jar包
充电器(手机和220V电压)
jdbc-odbc桥
16.桥梁模式(Bridge)应用实例
jdbc驱动程序
在基于HTTP协议的远程管理软件HttpAdmin的设计中,Controller需要向某个Provider发送请求命令,并通过Provider的 相应完成一个命令的处理。这些命令有很多种,但是每种命令都要使用一种传输类型来发送和接收数据,命令和传输类型都有相应的封装类(传输类型的封装类在第 七章已经介绍了)。命令类型各种各样,并且它们的处理方式也是大相径庭,所以命令封装类是一个变数,同时,传输类型也是一个变数,因为传输类型也有很多 种,那么如何在命令封装类和传输类型封装类这两个变数之间建立联系呢,使用桥模式就是最好的选择。
17.代理模式(Proxy)应用实例
用代理服务器连接出网
销售代理(厂商)律师代理(客户)
Foxmail
枪手
18.享元模式(Flyweight)应用实例
字体的26个字母和各自的斜体等
19.状态模式(State)应用实例
人心情不同时表现不同有不同的行为
编钟
登录login logout
20.观察者模式(Observer)应用实例
某些公司邮件系统的应用。当公司员工向这个邮箱发邮件时会发给公司的每一个员工。如果设置了Outlook则会及时收到通知,接收到短消息
21.模板方法模式(Template)应用实例
使用网页设计时使用的模板架构网页(骨架)算法的各个逻辑系统
个人计算机信息管理软件“SysAdmin”采用支持插件的架构体系,每种插件都有一个相应的CxxxPlusIn与之对应,其基类是CPlusIn类, 由于CPlusIn类的很多方法都是抽象方法,它们的实现需要延迟到相应的CxxxPlusIn类实现,所以CPlusIn类的设计采用了模板模式。
22.访问者模式(Visitor)应用实例
电脑销售系统:访问者(自己)---〉电脑配置系统(主板,CPU,内存等)
23.迭代子模式(Iterator)应用实例
查询数据库,返回结果集(map, list, set)
六、总结
设计模式是面向对象编程的热门话题之一,越来越多的开发人员认识到设计模式的重要性。采用各种语言实现设计模式的文章也越来越多,但是很多开发人员发现很难将设计模式与实际开发中需要解决的具体问题相联系。因为使用设计模式的难点往往不在于模式的实现,而在于很难确定哪种模式可以在现实的应用场景中采用,从而导致了在现实的项目中,面对客户的压力,我们总是采用最直截了当的方法解决问题,来不及多考虑这些方法的优劣,即使明知将带来更大的麻烦也必须如此。有些时候因为选择了不恰当的设计模式,使原本简单的问题变得复杂化。