C++设计模式(第一周)

part 1 设计模式简介

  课程目标

  1.理解松耦合设计思想
  2.掌握面向对象设计原则
  3.掌握重构技法改善设计
  4.掌握GOF 核心设计模式

  什么是设计模式?

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

  从面向对象谈起

  底层思维:向下,如何把握机器底层从微观理解对象构造

  #语言构造
  #编译转换
  #内存模型
  #运行时机制

  抽象思维:向上,如何将我们的周围世界抽象为程序代码
  #面向对象
  #组件封装
  #设计模式
  #架构模式

  封装、继承、多态是底层思维。

  深入理解面向对象

  向下:深入理解三大面向对象机制
  #封装,隐藏内部实现
  #继承,复用现有代码
  #多态,改写对象行为

  向上:深刻把握面向对象机制所带来的抽象意义,理解如何使用这些机制来表达现实世界,掌握什么是“好的面向对象设计”。

  软件设计固有的复杂性

  “建筑商从来不会去想给一栋已建好的100层高的楼房底下再新修一个小地下室——这样做花费极大而且注定要失败。然而令人惊奇的是,软件系统的用户在要求作出类似改变时却不会仔细考虑,而且他们认为这只是需要简单编程的事”。——Object-Oriented Analysis and Designwith Applications

  软件设计复杂的根本原因

  变化:客户需求的变化、技术平台的变化、开发团队的变化、市场环境的变化。

  如何解决复杂性

  #分解
  人们面对复杂性有一个常见的做法:即分而治之,将大问题分解为多个小问题,将复杂问题分解为多个简单问题。

  #抽象
  更高层次来讲,人们处理复杂性有一个通用的技术,即抽象。由于不能掌握全部的复杂对象,我们选择忽视它的非本质细节,而去处理泛化和理想化了的对象模型。

  软件设计的目标

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

  C++类继承方式中,private 和 protected 方式很少用到。

  子类对象可以复制给父类对象,但会导致切割的发生。所以用指针(或者引用)的形式。比如

class Shape { };

class Rect: public Shape {
public:
    Rect(int x, int y):x(x), y(y) {}
    int x;
    int y;
};

int main() {
    vector<Shape> v;
    Rect r(1, 2);
    v.push_back(r);
    cout << v[0].x;
    return 0;
}

  编译器报错:class “Shape” 没有成员 x。

  但是如果换成指针形式,代码如下:

class Shape { };

class Rect: public Shape {
public:
    Rect(int x, int y):x(x), y(y) {}
    int x;
    int y;
};

int main() {
    vector<Shape*> v;
    v.push_back(new Rect(1, 2));
    // 这里是不一样的地方
    Rect* p = (Rect*)v[0];
    cout << p->x  ;
    return 0;
}

  用到了指针类型转换,但是对象本身没有被切割。

part 2 面向对象设计原则

  面向对象设计,为什么?

  #变化是复用的天敌!

  面向对象设计最大的优势在于:抵御变化!

  重新认识面向对象
  #理解隔离变化
    从宏观层面来看,面向对象的构建方式更能适应软件的变化,能将变化所带来的影响减为最小。
  #各司其职
    从微观层面来看,面向对象的方式更强调各个类的“责任”。
    由于需求变化导致的新增类型不应该影响原来类型的实现——是所谓各负其责
  #对象是什么?
    从语言实现层面来看,对象封装了代码和数据。
    从规格层面讲,对象是一系列可被使用的公共接口。
    从概念层面讲,对象是某种拥有责任的抽象。

  C++虚函数的调用模式了解以后,才能更好的掌握23种设计模式,单更应该回归八大设计原则。

  八大设计原则比23种设计模式更重要!

  1.依赖倒置原则(DIP)
    高层模块(稳定)不应该依赖于低层模块(变化),二者都应该依赖于抽象(稳定) 。
    抽象(稳定)不应该依赖于实现细节(变化) ,实现细节应该依赖于抽象(稳定)。

  2. 开放封闭原则(OCP)
    对扩展开放,对更改封闭。
    类模块应该是可扩展的,但是不可修改。

  3. 单一职责原则(SRP)
    一个类应该仅有一个引起它变化的原因。
    变化的方向隐含着类的责任。

  (如果一个类有太多的方法——78-80个——说明该类的职责不明确)

  4. Liskov 替换原则(LSP)
    子类必须能够替换它们的基类(IS-A)。
    继承表达类型抽象。

  5. 接口隔离原则(ISP)
    不应该强迫客户程序依赖它们不用的方法。
    接口应该小而完备。

  6. 优先使用对象组合,而不是类继承
    类继承通常为“白箱复用”,对象组合通常为“黑箱复用”。
    继承在某种程度上破坏了封装性,子类父类耦合度高。
    而对象组合则只要求被组合的对象具有良好定义的接口,耦合度低。

  7. 封装变化点
    使用封装来创建对象之间的分界层,让设计者可以在分界层的一侧进行修改,而不会对另一侧产生不良的影响,从而实现层次间的松耦合。

  8. 针对接口编程,而不是针对实现编程
    不将变量类型声明为某个特定的具体类,而是声明为某个接口。
    客户程序无需获知对象的具体类型,只需要知道对象所具有的接口。
    减少系统中各部分的依赖关系,从而实现“高内聚、松耦合”的类型设计方案。

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

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

时间: 2024-10-08 02:08:59

C++设计模式(第一周)的相关文章

#设计模式#GeekBand设计模式第一周课程

今天看了李老师的设计模式,晚上在此通过记忆整理一下,明天再根据笔记详细整理. ————————通过记忆整理———————————————————————— 设计原则 比 设计模式 更本质 目前常用的设计模式有23种,然而这都是方法,更重要的是其中本质的东西:设计原则,设计思想. 分解和抽象 面向对象的三个重要概念是:1.封装  2.继承 3.多态 但是这三个概念都是底层的,在上层上需要使用“抽象”的思想去处理问题. 分解:分而治之,经常使用的解决问题的方法,把问题拆分开来 抽象:将问题统一起来看

20155336 2016-2017-2《JAVA程序设计》第一周学习总结

# 20155336  2016-2017-2<JAVA程序设计>第1周学习总结 ## 教材学习内容总结 开学的第一周,带着些许的欣喜和好奇,听完了老师的第一堂课.说心里话学习JAVA仿佛观看一部英文影视作品一样头疼, 因为总会有许许多多相似的名字让你记得晕头转向.JAVA也是一样,什么JVM啊JRE啊JDK啊 (/(ㄒoㄒ)/~~)  等等一系列 的英文缩写,让人心神意乱~~但总体上对JAVA有了一个初步的了解.通过课上老师的介绍以及课下对JAVA书第一章的浏览, 我简单的了解了JAVA艰辛

20145216 史婧瑶《信息安全系统设计基础》第一周学习总结

20145216 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 Linux基础 1.ls命令 ls或ls .显示是当前目录的内容,这里“.”就是参数,表示当前目录,是缺省的可以省略.我们可以用ls -a .显示当前目录中的所有内容,包括隐藏文件和目录.其中“-a” 就是选项,改变了显示的内容.如图所示: 2.man命令 man命令可以查看帮助文档,如 man man : 若在shell中输入 man+数字+命令/函数 即可以查到相关的命令和函数:若不加数字,那man命令默认从数字较

第一周例行报告

PSP 内容 类别 预计时长 开始时间 结束时间 中断时间 实际花费时间 第一周作业一 写作 1h 2017-9-7  19:25 2017-9-7  20:18  回复微信消息5min 48min 看<构建之法> 阅读 一周,每天1h30min 2017-9-7  21:35 2017-9-10   每天抽空看一些 没有具体时间 采访记录 写作 1h 2017-9-9   20:46 2017-9-9 22:04  一边写一边吃火龙果  1h左右 构建之法读后感 写作 1h 2017-9-1

《嵌入式设计》第一周学习总结

<嵌入式设计>第一周学习总结 学习时遇到的主要问题 1.运行环境未及时安装 2.命令不熟练 3.上课状态不好 解决方法 1.及时安装环境并熟悉运行 2.参考Linux操作系统实用教程并百度一些问题的解决办法 3.及时调整自己状态 主要学习内容 Linux一些简单基本的操作, 用.c文件输出hello word 用vi test.c 创建.c文件 #include <stdio.h> int main(){ printf("hello word\n"); } 并用

20145311 《信息安全系统设计基础》第一周学习总结

20145311 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 常用的部分命令 CTRL+SHIFT+T:新建标签页,编程时有重要应用: ALT+数字N:终端中切换到第N个标签页,编程时有重要应用: Tab:终端中命令补全,当输入某个命令的开头的一部分后,按下Tab键就可以得到提示或者帮助完成: CTRL+C:中断程序运行 Ctrl+D:键盘输入结束或退出终端 Ctrl+S: 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+A: 将光标移至输入行头,相当于Home键 Ctrl+E

2016-7第一周工作总结

姓名 王奈 时间 第一周工作总结 学习内容 经过了一周的开发与改进,我们的easy工大已经初见成果.这一周,我们完成了:界面的重新设计,数据获取正确性修改,以及吐槽墙功能的实现等等.我的工作就是文档记录,在这过程中,我能够记录我们项目进步的点点滴滴,记录它是如何一步一步走到现在的样子,就像看到了软件的成长过程一样. 除此之外,我还完成了一个嵌入式开发项目的初步实现,学习了嵌入式编程的原则以及优化方法.如同软工所要求的一样,我在嵌入式开发的过程中也使用了文档记录的方法来管理我们的项目进度,这样一来

JS第一周总结1

JS第一周总结 这周我学习了JS的基础部分,大致分为了: a.基础变量及数据类型 b.特殊数据类型 c.JS基础语句类型 d.BOM操作 e.DOM操作 ###基础变量###     1.首先给变量取名,取名规范有3点:         1.变量首字符必须是字母或者美元符号$.下划线_ 三者之一.         2.变量名字中不能包括特殊符号,比如空格.加减号等符号.         3.变量中不能包括JS中的关键字,比如var之类的. 2.取好名字之后,我们需要将这个变量定义出来,并且赋值给

20145321曾子誉《Java程序设计》第一周学习总结

20145321 <Java程序设计>第1周学习总结 教材学习内容总结 第一章 1.三大平台:Java SE.Java EE .Java ME 2.Java SE:由JVM.JRE.JDK.Java语言四部分组成. JVM:操作系统,虚拟机. JRE:执行环境,包括JVM. JDK:包含JRE及开发过程中需要的一些工具程序. 3.JCP.JSR.RI.TCK的关系:任何想要提议加入Java的功能或特性,必须以JSR正式文件的方式提交,经过JCP这个国际组织投票通过,成为最终文件,由此做出的参考

20145201 《Java程序设计》第一周学习总结

# 20145201 <Java程序设计>第一周学习总结 ## 教材学习内容总结 万事开头难,终于开始学习了Java.寒假的时候看到老师的要求确实有点慌,但是这周翻开书,从书本知识第一行学起,发现并不是自己想想中那么难,只要一步一个脚印,每周有自己的计划,并按照计划按部就班的完成,最后一定会拥有自己的小成果的. 1.1Java不只是语言 Java经过多年的版本更新后,最新的版本是Java SE8. 在java发展的过程中,它的应用领域越来越广,根据不同级别的应用开发区分了不同的应用版本,最终j