1.1 设计模式怎样解决设计问题

1.1.1 寻找合适的对象

面向对象设计最困难的部分是将系统分解为对象的集合。

设计的许多对象来源于现实世界的分析模型,这里和领域驱动设计有点关联。分析所得到的类,很多事现实中并不存在的类。这是抽象的结果。设计中的抽象对于产生灵活的设计至关重要。就像我设计的一个流程调度模型。

1.1.2 决定对象的粒度

记笔记可以让我达到沉流的状态。

1.1.3 指定对象接口
1.1.4 描述对象实现

OMT表示法:

1、 对象:最上面的黑体表示类名,下面依次是操作,数据。

wps_clip_image-219

2、 实例化:虚线箭头表示一个类实例化另外一个对象。

wps_clip_image-245

3、 继承:竖线和三角表示继承关系。

wps_clip_image-263

4、 抽象类:类名以黑体斜体表示,操作也用斜体表示。

5、 引用

wps_clip_image-293

箭头加黑点表示一个类引用另外一个类。

重点:

1、 类的继承和接口继承的比较

对象的类和对象的类型的区别:

对象的类定义了对象是怎样实现的,同时也定义了对象内部状态和操作的实现。对象的类型只与它的接口有关。一个对象可以由多个类型(支持多个接口),不同类的对象可以有相同的类型。

类和类型紧密相连,类定义了对象的操作,也定义了对象的类型。

类的继承和接口的继承的差别:

c++中接口继承接近于公有继承纯抽象类。纯实现继承或纯类继承接近于私有继承。

2、 对接口编程,而不是对实现编程——面向对象设计的第一个原则

1.1.5 运用复用机制

1、 继承和组合的比较

继承是一种白箱复用,父类的内部细节对子类可见。

对象组合彼此不知道对方内部细节,成为黑箱复用。

继承的优缺点:

1) 子类可以直接重定义父类的操作。

2) 编译时刻决定了,无法在运行期间更改。

3) 子类要知道父类的实现细节,这样就部分破坏了封装性。子类和父类依赖过于紧密,父类的某些变化必然导致子类的变化。开发过程中遇到过类似的问题。这种依赖,限制了灵活性以及复用性。比如,服务体系中经常出现这样的问题,导致代码拷贝。

组合(通过获得对象的引用而在运行时刻动态的定义)的优缺点:

1) 对象间通过接口彼此交互。

2) 对象只能通过接口访问,不要也不能知道对方细节,这样不会破坏封装性。

3) 运行时刻可以使用另外一个对象替换这个对象,提高了灵活性。

4) 对象的实现基于接口编写,所以实现上存在较少的依赖关系。

5) 优先使用组合有助于保持每个类被封装,并被集中在单个任务上,提高整体内聚性。类和类的层次都维持一个较小的规模,

6) 基于对象组合的设计会有更多的对象(而又较少的类),且系统的行为依赖于对象间的关系而不是定义在某个类的内部。

理想的情况下,应该通过组合原有构件实现新的功能,而不是创建新的构件。

面向对象设计的第二个原则:优先使用对象组合,而不是类继承。

2、 委托

委托时一种组合方法,它是组合具有与继承同样的能力。

委托的主要优点在于它便于在运行时刻组合对象操作,以及更改操作的组合方式。它是软件更加的灵活。

和其他的技术方案相同,它也存在不足之处:增加了软件的复杂度——动态的,高度参数化的软件比静态的软件更难于理解。

3、 继承和参数化类型的比较

1.1.6 关联运行时刻的结构和编译时刻的结构
1.1.7 设计应支持变化

设计应该支持变化——所说的是,一个设计方案,对变化要有一定的适应性,即封装变化。

变化是导致重新设计的原因。设计要对一定范围内的变化友好。

4、 

对于程序的分层设计,对于处于同一分层的模块,对外应保持一定的抽象,并且,使用同种类型的通信协议。


只有注册用户登录后才能发表评论。


网站导航:
 

posts - 19, comments - 0, trackbacks - 0, articles - 0

Copyright © 常高伟