设计模式概述
一 什么是设计模式
设计模式就是一套代码设计经验的总结,它是被反复使用的、多人知晓的、经过分类编目的。使用设计模式提高了代码的重用性、可维护性和可靠性。
设计模式包括四个基本要素:
- 模式名称(pattern name)
- 问题(problem)
- 解决方案(solution)
- 效果(consequences)
一个模式名称就概括描述了某一类问题应该用什么样的解决方案及用这样做的效果。
二 设计模式的历史
设计模式在软件行业中的起源可以追溯到1987年,Ward Cunningham和Kent Beck用Smalltalk做设计用户界面的工作的时候决定用Alexander的理论发展出一个有五个模式的语言指导Smalltalk新手。
从那以后,Jim Coplien开始搜集C++语言的idioms,并写成著作《Advanced C++ Programming Style and Idioms》。
1990年到1992年,GOF开始搜集模式的工作。
1993年,Kent Beck和Grady Booch主持第一次模式会议,那以后不久,GOF的《Design Pattern》发表。
从那以后,模式大会每年一次在美国举行。大会的论文也汇编成书。
模式也不断被应用到软件工程的各个方面,但至今得到最深研究的仍然是设计模式和代码模式。
三 设计模式的原则
1、"开-闭"原则
一个软件实体应当对扩展开放,对修改关闭。就是说:模块应尽量在不修改原(是"原",指原来的代码)代码的情况下进行扩展。
2、里氏代换原则
任何基类可以出现的地方,子类一定可以出现。
要依赖于抽象,不要依赖于实现。
4、合成/聚合复用原则
要尽量使用合成/聚合,而不是继承关系达到复用的目的。
5、迪米特法则
一个软件实体应当与尽可能少的其它实体发生相互作用。
6、接口隔离原则
定制服务的例子,每一个接口应该是一种角色,不多不少,不干不该干的事,该干的事都要干
7、抽象类
抽象类不会有实例,一般作为父类为子类继承,一般包含这个系的共同属性和方法。
注意:好的继承关系中,只有叶节点是具体类,其他节点应该都是抽象类,也就是说具体类是不被继承的。将尽可能多的共同代码放到抽象类中。
四 设计模式的分类
根据目的准则和范围准则对23种经典模式进行分类
目的 | ||||
创建型 | 结构型 | 行为型 | ||
范围 | 类 | Factory Method(工厂方法) | Adapter(适配器) | Interpreter(解释器)Template Method(模板 方法) |
对象 | Abstract Factory(抽象工厂) Builder(生成器) Prototype(原型) Singleton(单件) | Adapter(适配器) Bridge(桥接) Composite(组成) Decorator(装饰) Facade(外观) Flyweight(享元) Proxy(代理) | Chain Of Responsibility (职责链) Command(命令) Iterator(迭代器) Mediator(中介者) Memento(备忘录) Observer(观察者) State(状态) Strategy(策略) Visitor(访问者) |
五 设计模式的使用
1 合理使用模式,杜绝过度设计和模式痴迷
像http://developers.slashdot.org/comments.pl?sid=33602&cid=3636102 就是一个讽刺模式痴迷的例子。对于某些初学者经常认为:在同一个应用中,用的模式越多,人就越牛。自己猛着套模式,崇拜能套更多模式的人!
2 应该通过重构实现、趋向和去除模式。
参考文献
1 Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides 著.李英军,马晓星,蔡敏,刘建中 译. 设计模式:可复用面向对象软件的基础[M]. 机械工业出版社,2000
2 阎宏. java与模式[M]. 电子工业出版社,2002
3 Joshua Kerievsky著. 杨光,刘基诚译.重构与模式[M].人民邮电出版社,2006