分类: C/C++
2012-03-25 19:30:15
模式的定义:模式是在某情境(context)下,针对某问题的某种解决方案。
模式的定义其实并没有很好地描述模式。定义中三个要素是“问题”、“情境”和“解决方案”。考虑下面的例子:
问题:我要如何准时上班?
情境:我将钥匙锁在车里了。
解决方案:打破窗口,进入车内,启动引擎,然后开车上班。
这样是一个模式吗?不是。因为一再地打破车窗称不上一个可以反复应用的解决方案。同时这种解决方案别人也不容易采用。其次,它没有一个名字。
一个更好描述模式的方式是“模式类目”,它需要一个模式描述出以下元素:
名称:好的名称可以使模式成为开发人员之间的共享词汇的一部份。
意图(Intent):简短地描述该模式的作用。也可以看作是模式的定义。(问题、情境和解决方案)
动机(Motivation):给出了问题以及如何解决这个问题的具体场景。
适用性(Applicability):描述模式可以被应用在什么场合。
结构(Structure):提供了图示,显示出参与此模式的类之间的关系。
参与者(Participants):描述在此设计中所涉及到的类和对象在模式中的责任和角色。
协作(Collaborations):告诉我们参与者如何在此模式中合作。
结果(Consequences):描述采用此模式之后可能产生的效果,好的与不好的。
实现(Implementation):提供了你在实现该模式时需要使用的技巧,以及你应该小心面对的问题。
范例代码(Sample Code):提供代码的片段,可能对你的实现有帮助。
已知应用(Known Uses):用来描述已经在真实系统中发现的模式例子。
相关模式(Related Patterns):描述此模式和其他模式之间的关系。
模式的分类:
创建型:涉及到将对象实例化,这类模式者提供一个方法,将客户从所需要实例化的对象中解耦。(Singleton、Abstract Factory、Factory Method、Builder、Prototype)
行为型: 涉及到类和对象如可交互及分配职责。(Template Method、Command、Iterator、Observer、State、Strategy、Visitor、Mediator、 Interpreter、Memento、Chain of Responsibility)
结构型:把类或对象组合到更大的结构中。(Decorator、Composite、Adapter、Proxy、Facade、Flyweight、Bridge)
使用模式的指南:
简单才是王道。如果你不用模式就能够设计出更简单的方案,那就去干吧。需要的时候把模式从设计中删除。
为实际需要的扩展使用模式。不要只是为了假想的需要而使用模式。
模式是工具而不是规则,需要被适当地调整以符合你的需求。
重构的时间就是模式的时间。
模式是被发现的,而不是被发明的。
反模式告诉你如何采用一个不好的解决方案解决一个问题。有些模式看起来很好,但是真正采用时会带来麻烦。通过将反模式归档,可以帮助人们在遇到问题时避免使用该模式。
不同领域中的模式:
架构模式:用来建立生气勃勃的建筑、城镇和城市的架构。这也正是模式开始的地方。
应用模式:是建立系统级架构的模式。许多多层的架构都属于这一类目。(如C/S和MVC)
领域特定模式:关注特定领域的问题,例如并发系统或实时系统。(如J2EE)
业务流程模式:描述业务、顾客和数据之间的交互,此种模式能够处理如“如何有效决策并沟通决策”之类的问题。(项目管理)
组织模式:描述了人类组织的结构以及实践。到目前为止大多数努力聚集于制造或支持软件的组织。
用户界面设计模式:致力于解决设计交互式软件时的问题。