第十一周 C++设计模式 Boolan 李建忠

2017-03-25  本文已影响0人  一般的路人丙

1. 设计模式简介

课程目标

什么是设计模式

“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。”

GOF 设计模式

从面向对象谈起

深入理解面向对象

软件设计固有的复杂性

建筑商从来不会去想给一栋已建好的100层高的楼房底下再新修一个小地下室……

软件设计复杂的根本原因

变化

如何解决复杂性?

重要的建立一些思想和模型。

举例

Shape1(分解)
Shape2(抽象)
基类最好要有虚的析构函数。
所有继承最好都要用public的继承。
多态性->指针
第一种如果要变更,需要在所有涉及的地方修改。
第二种如果要变更,如果使用工厂模式,只需要增加一个子类。重用性得到了很高的提升。

软件设计的目标

什么是好的软件设计?软件设计的金科玉律:

复用!

2. 面向对象设计原则

面向对象设计,为什么?

变化是复用的天敌!
面向对象设计最大的优势在于:

抵御变化

重新认识面向对象

面向对象设计原则(1/8)

MainForm(依赖)->Line Rect
MainForm(依赖)->Shape<-(依赖)Line Rect

面向对象设计原则(2)

面向对象设计原则(3)

面向对象设计原则(4)

面向对象设计原则(5)

一旦产生依赖,就必须保持稳定。

面向对象设计原则(6)

面向对象设计原则(7)

面向对象设计原则(8)

面向接口设计

产业强盛的标志

接口标准化!

分工协作,通过分工实现复用性。

以史为鉴(1)

秦为什么能够统一六国?
根据史书记载和考古发现,秦的兵器不论东南西北,出土地点都有统一的标准,包括剑,戈,弩,甚至弩机,弩体,箭头都是一样的。而其他六国则不是。

以史为鉴(2)

毕升的活字印刷为什么成为四大发明,推动了人类文明的前进?
毕升之前的雕版印刷将字刻死在木板或石板上……

将设计原则提升为设计经验

  1. 设计习语 Design Idioms
    Design Idioms 描述与特定编程语言相关的低层模式,技巧,惯用法。
  2. 设计模式 Design Patterns
    Design Patterns 主要描述的是“类与相互通信对象之间的组织关系,包括它们的角色、职责、协作方式等方面。
  3. 架构模式 Architectural Patterns
    Architectural Patterns 描述系统中与基本结构组织关系密切的高层模式,包括子系统划分,职责,以及如何组织它们之间关系的规则。

3. 模板方法 Template Method

GOF-23 模式分类

从封装变化角度对模式分类

重构获得模式 Refactoring to Patterns

推荐图书

重构——改善既有代码的设计
Refactoring to Patterns 重构与模式

重构关键技法

是从不同角度谈一个问题

“组件协作”模式:

Template Method

动机(Motivation)

基类一定要写虚的析构函数

结构化软件设计流程 面向对象软件设计流程 早绑定与晚绑定

常见方式

将过程写到库中,过程中留有虚函数,在复用时定义虚函数。
纵向的灵活性。

模式定义

定义一个操作中的算法的骨架(稳定),而将一些步骤延迟(变化)到子类中。Template Method 使得子类可以不改变(复用)一个算法的结构即可重定义(override 重写)该算法的某些特定步骤。
——《设计模式》Gof
稳定是指的相对稳定,变化只是相对不稳定。

结构(Structure)

结构(Structure)

TemplateMethod() 稳定
PrimitiveOperation() 变化
每次遇到Lib,都要知道哪些是稳定的部分,哪些是不稳定的部分。

要点总结

4. 策略模式

策略模式(Strategy)

动机(Motivation)

多态性就要求指针必须可以指向多种类,不是一个确定的类,引用不可以。

模式定义

定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)。
——《设计模式》Gof

常见方式

构建一个基类,多个子类。
构建一个类,引用这个基类,并在函数中由其他参数决定使用哪个子类。
横向的自由度。

结构(Structure)

Context和Strategy稳定
ConcreteStrategy变化

要点总结

Observer 观察者模式

动机(Motivation)

多继承可以是一个继承基类,以及多个继承接口

模式定义

定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。
——《设计模式》Gof

结构(Structure)

Subject和Observer是稳定的
ConcreteSubject和CencreteObserver是变化的

常见方法

构建一个消息类,在基类中建立其List表,然后由其他对象获取其状态。

要点总结

这是一种非常常用的模式。

“单一职责”模式:

Decorator 装饰模式

动机(Motivation)

一般结构 装饰结构

组合优于继承

NetworkStream::Read(number);//继承实现,静态特质
stream->Read(number);//组合实现,动态特质,可以改变
···
### 模式定义
动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码&减少子类个数)。
——《设计模式》GoF

![结构(Structure)](https://img.haomeiwen.com/i4119448/9f6b4cceeffe7984.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

Component Decorator 稳定
ConcreteConment ConcreteDecorator 变化

### 要点总结
* 通过采用组合而非继承的首发,Decorator模式实现了在运行时动态扩展对象功能的能力,而且可以根据需要扩展多个功能。避免了使用继承带来的“灵活性差”和“多子类衍生问题”。
*  Decorator类在接口上表现为is-a Component的继承关系,即Decorator类继承了Component类所具有的接口。但在实际上又表现为has-a Component的组合关系,即Decorator类又使用了另外一个Component类。
* Decorator 模式的目的并非解决“多子类衍生的多继承”问题,Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”——是为“装饰”的含义。

## Bridge 桥模式
### 动机(Motivation)
* 由于某些类型的固有的实现逻辑,使得他们具有两个变化的维度,乃至多个维度的变化。
* 如何应对这种“多个维度的变化”?如何利用面向对象技术来使得类型可以轻松地沿着两个乃至多个方向变化,而不引入额外的复杂度?

### 模式定义
将抽象部分(业务功能)与实现部分(平台实现)分离,使它们都可以独立地变化。
——《设计模式》 GoF

![结构(Structure)](https://img.haomeiwen.com/i4119448/57b1fd891e09c501.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Abstraction Implementor 稳定
RefinedAbstraction ConcreteImplementor 变化

### 要点总结
* Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自的维度的变化,即“子类化”它们。
* Bridge模式有时候类似于多继承方案,但是多继承方案往往违背单一职责原则(即一个类只有一个变化的原因),复用性比较差。Bridge模式是比多继承方案更好的解决方法。
* Bridge模式的应用一般在“两个非常强的变化维度”,有时一个类也有多于两个的变化维度,这时可以使用Bridge的扩展模式。
上一篇 下一篇

猜你喜欢

热点阅读