读书笔记:设计模式-第一章引言

来源:互联网 发布:linux显示系统时间 编辑:程序博客网 时间:2024/05/21 14:43
第一章:引言

本书目的:就是将面向对象软件的设计经验作为设计模式记录下来。

1.1 什么是设计模式?
一般而言,一个模式有四个基本要素:
1. 模式名称/pattern name:用一两个词来描述模式的问题、解决方案和效果。
2. 问题/problem:描述了应该在何时使用模式。前因后果,特定问题,先决条件。
3. 解决方案/solution:描述了设计的组成部分。不是特定而具体的设计及实现,而是提供设计问题的抽象描述。
4. 效果/consequences:描述了模式应用的效果及使用模式应权衡的问题。对系统的灵活性、扩充性或者可移植性的影响。
本书中的设计模式是:对被用来在特定场景夏解决一般设计问题的类和相互通信的对象的描述。

1.2 Smalltalk MVC中的设计模式
MVC包括三类对象:模型Model是应用对象,试图View是它在屏幕上的表示,控制器Controller定义用户界面对用户输入的相应方式。
MVC建立“订购/通知”协议来分离视图和模型。这个更一般的设计被描述为Observer模式。
MVC的另一个特性是视图可以嵌套。这个设计被描述为Composite模式
View-Controller关系是Strategy模式的一个例子。
MVC还使用了其他的设计模式,如用来制定视图缺省控制器的Factory Method和用来增加视图滚动的Decorator。
MVC的主要关系还是由Observer、Composite和Strategy三个设计模式组成。

1.3 描述设计模式
模式名和分类
意图
别名
动机
适用性
结构
参与者
协作
效果
实现
代码示例
已知应用
相关模式

1.4 设计模式的编目
Abstract Factory
Adapter
Bridge
Builder
Chain of Responsibility
Command
Composite
Decorator
Facade
Factory Method
Flyweight
Interpreter
Iterator
Mediator
Memento
Observer
Prototype
Proxy
Singleton
State
Strategy
Template Method
Visitor

1.5 组织编目

设计模式空间
目的创建型结构型行为型范围Factory MethodAdapterInterpreterTemplate Method对象Abstract FactoryBuilderPrototypeSingletonAdapterBridgeCompositeDecoratorFacadeFlyweightProxyChain of ResponsibilityCommandIteratorMediatorMementoObserverStateStrategyVisitor
设计模式之间的关系


1.6 设计模式怎样解决设计问题
1.6.1 寻找合适的对象
面向对象设计最困难的部分是将系统分解成对象集合。面向对象设计方法学支持许多设计方法。设计的许多对象来源于现实世界的分析模型。设计模式帮你确定并不明显的抽象和描述这些抽象的对象。
1.6.2. 决定对象的粒度
Facade模式描述了怎样用对象表示完整的子系统,Flyweight模式描述了如何支持大量的最小粒度的对象。其他一些设计模式描述了将一个对象分解成许多小对象的特定方法。
1.6.3 指定对象接口
方法签名/型构(signature):由方法名、返回类型、参数列表组成。
接口(interface):定义所有signature的集合被成为该对象的接口。
类型(type):用来标识特定接口的一个名字。子类型/超类型
对象接口与其功能实现是分离的。
动态绑定(dynamic binding):发送给对象的请求和它的相应操作在运行时刻的连接。发送的请求直到运行时刻才受你的具体的实现的约束。动态绑定允许你在运行时刻彼此替换有相同接口的对象。这种可替换性称为多态(polymorphism)。
Memento模式描述了怎样封装和保存对象内部的状态,以便一段时间后对象能恢复到这一状态。
设计模式指定了接口之间的关系。
1.6.4 描述对象的实现
OMT表示法:类图
抽象类(abstract class)的主要目的是为它的子类定义公共接口。
类继承/抽象类/混入类(多继承才会有)
     1. 类继承和接口继承的比较。
对象的类(class)和对象的类型(type)之间的差别。
对象的类定义了对象是怎样实现的,同时也定义了对象的内部状态和操作的实现。
对象的类型只与它的几口有关。接口即对象能相应的请求的集合。
一个对象可以有多个类型,不同类的对象可以有相同的类型。
类也定义了对象的类型。
类继承和接口继承
类继承:根据一个对象的实现定义了另一个对象的实现,它是代码和表示的共享机制。
接口继承:描述了一个对象什么时候能被用来替代另一个对象。
很多设计模式依赖这种差别。Chain of Responsibility模式中的对象必须有一个公共的类型,但一般情况夏它们不具有公共的实现。composite模式中,构件定义了一个公共的接口,但Composite通常定义一个公共的实现。Command、Observer、State和Strategy通常纯粹做为接口的抽象类来实现。
2. 对接口编程,而不对实现编程
只根据抽象类中定义的接口来操纵对象有两个好处:
1)客户无须知道它们使用对象的特定类型,只须对象有客户所期望的接口。
2)客户无须知道它们使用的对象是用什么类事项的,它门只须知道定义接口的抽象类。
不将变量生命为某个特定的具体类的实例对象,而是让他遵从抽象类所定义的接口。
创建型模式确保你的系统是采用针对接口的方式书写的,而不是针对实现而书写的。
1.6.5 运用复用机制
1. 继承和组合的比较
通过生成子类的复用通常被称为“白箱复用”
组合的复用方式是“黑箱复用”。
继承和复用各自的优缺点。
类继承可以比较方便地改变被复用的实现。不足:编译时刻定义,运行时无法改变。定义了部分子类的具体表示。“破坏了封装性”。
组合要求对象遵守彼此的接口约定。只能只能通过接口访问。依赖关系较少。
优先使用组合有助于保持每个类被封装,并集中在单个任务上。类和类继承层次会保持较小的规模,不会增长到不可控。会有更多的对象,依赖于对象间的关系而不是被定义在某个类中。

优先使用对象组合,而不是继承。

2. 委托
委托是一种组合方法。它使组合具有和继承同样的复用能力。缺点:与继承相比,难于理解
使用委托的设计模式:State、Strategy、Visitor
3. 继承和参数化类型的比较

1.6.6 关联运行时刻和编译时刻的结构
聚合意味着聚合对象和其所有者有相同的生命周期。
相识意味着一个对象仅仅知道另一个对象。
1.6.7设计应支持变化
一些导致重新设计的一般原因,以及解决这些问题的设计模式。
1)通过显示地指定一个类来创建对象。应该间接地创建对象。设计模式:Abstract Factory、Factory method、Prototype。
2)对特殊操作的依赖。为避免把请求代码写死。设计模式:Chain of Resposibility、Command
3)对硬件和软件平台的依赖。 设计模式:Abstract Factory、 Bridge
4)对对象表示和实现的依赖。设计模式:Abstract Factory、 Bridge, Memento, Proxy
5)  算法依赖。设计模式:Builder, Iterator, Strategy, Template Method.
6)  紧耦合 设计模式:Abstract Factory, Command, Facade, Mediator, Observer, Chain of Responsibility
7)  通过生成子类来扩充功能  设计模式:Bridge, Chain of Responsibility, Composite, Decorator, Observer, Strategy.
8)  不能方便地对类进行修改  设计模式:Adapter, Decorator, Visitor

设计模式有助于增强软件的灵活性。

设计模式在开发如下三类主要软件中所起的作用:应用,工具箱和框架。
1. 应用程序
设计模式通过减少依赖性来提高内部复用性。
当设计模式被用来对系统分层和限制对平台的依赖性时,它们海辉使一个应用更具可维护性。
2. 工具箱
工具箱强调的使代码服用,它们使面向对象环境下的“子程序库”
3. 框架
模式和框架的最主要的不同:
1)设计模式比框架更抽象。
2)设计模式是比框架更小的体系结构元素。
3)框架比设计模式更加特例化。

1.7 怎样选择设计模式
考虑设计模式是怎样解决问题的。1.6节
浏览模式的意图部分。1.4节
研究模式怎样互联
研究目的相似的模式
检查重新设计的原因
考虑你的设计中哪些是可变的。
1.8 怎样使用设计模式
大致浏览一遍设计模式
回头研究结构部分、参与者部分和协作部分
看代码示例部分,看看这个模式代码形式的具体例子
选择模式参与者的名字,使它们在应用上下文中有意义
定义类
定义模式中专用于应用的操作名称
实现执行模式中责任和协作的操作
0 0
原创粉丝点击