1.学习目标

1)理解松耦合设计思想;

2)掌握面向对象设计原则;

3)掌握重构技法改善设计;

4)掌握GOF核心设计模式;

2.定义

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

3.思维模型:

1)底层思维:向下,如何把握机器底层从微观理解对象构造。内容包括语言构造、编译转换、内存模型、运行时机制。

向下需要深入理解三大面向对象机制。

封装:隐藏内部实现

继承:复用现有代码

多态:改变对象行为

2)抽象思维:向上,如何将我们的周围世界抽象为成程序代码。内容包括面向对象、组件封装、设计模式、架构模式。

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

4.软件设计复杂性的根本原因:变化

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

5.如何解决复杂性

分解:分而治之,将大问题分解为多个小问题,将复杂问题分解为多个简单问题。

//Shape1.h
class Point{
public:
int x;
int y;
}; class Line{
public:
Point start;
Point end; Line(const Point& start, const Point& end){
this->start = start;
this->end = end;
}
}; class Rect{
public:
Point leftUp;
int width;
int height; Rect(const Point& leftUp, int width, int height){
this->leftUp = leftUp;
this->width = width;
this->height = height;
}
}; //增加
class Circle{
};
//MainForm1.cpp
class MainForm : public Form {
private:
Point p1;
Point p2; vector<Line> lineVector;
vector<Rect> rectVector;
//改变
vector<Circle> circleVector; public:
MainForm(){
//...
}
protected: virtual void OnMouseDown(const MouseEventArgs& e);
virtual void OnMouseUp(const MouseEventArgs& e);
virtual void OnPaint(const PaintEventArgs& e);
}; void MainForm::OnMouseDown(const MouseEventArgs& e){
p1.x = e.X;
p1.y = e.Y; //...
Form::OnMouseDown(e);
} void MainForm::OnMouseUp(const MouseEventArgs& e){
p2.x = e.X;
p2.y = e.Y; if (rdoLine.Checked){
Line line(p1, p2);
lineVector.push_back(line);
}
else if (rdoRect.Checked){
int width = abs(p2.x - p1.x);
int height = abs(p2.y - p1.y);
Rect rect(p1, width, height);
rectVector.push_back(rect);
}
//改变
else if (...){
//...
circleVector.push_back(circle);
} //...
this->Refresh(); Form::OnMouseUp(e);
} void MainForm::OnPaint(const PaintEventArgs& e){ //针对直线
for (int i = 0; i < lineVector.size(); i++){
e.Graphics.DrawLine(Pens.Red,
lineVector[i].start.x,
lineVector[i].start.y,
lineVector[i].end.x,
lineVector[i].end.y);
} //针对矩形
for (int i = 0; i < rectVector.size(); i++){
e.Graphics.DrawRectangle(Pens.Red,
rectVector[i].leftUp,
rectVector[i].width,
rectVector[i].height);
} //改变
//针对圆形
for (int i = 0; i < circleVector.size(); i++){
e.Graphics.DrawCircle(Pens.Red,
circleVector[i]);
}
//...
Form::OnPaint(e);
}

抽象:人们处理复杂性问题的通用技术,即抽象。由于不能掌握全部的复杂对象,我们选择忽视它的非本质细节,而去处理泛化和理想化了的对象模型。

//Shape2.h
class Shape{
public:
virtual void Draw(const Graphics& g)=0;
virtual ~Shape() { }
}; class Point{
public:
int x;
int y;
}; class Line: public Shape{
public:
Point start;
Point end; Line(const Point& start, const Point& end){
this->start = start;
this->end = end;
} //实现自己的Draw,负责画自己
virtual void Draw(const Graphics& g){
g.DrawLine(Pens.Red,
start.x, start.y,end.x, end.y);
} }; class Rect: public Shape{
public:
Point leftUp;
int width;
int height; Rect(const Point& leftUp, int width, int height){
this->leftUp = leftUp;
this->width = width;
this->height = height;
} //实现自己的Draw,负责画自己
virtual void Draw(const Graphics& g){
g.DrawRectangle(Pens.Red,
leftUp,width,height);
} }; //增加
class Circle : public Shape{
public:
//实现自己的Draw,负责画自己
virtual void Draw(const Graphics& g){
g.DrawCircle(Pens.Red,
...);
} };
class MainForm : public Form {
private:
Point p1;
Point p2; //针对所有形状
vector<Shape*> shapeVector; public:
MainForm(){
//...
}
protected: virtual void OnMouseDown(const MouseEventArgs& e);
virtual void OnMouseUp(const MouseEventArgs& e);
virtual void OnPaint(const PaintEventArgs& e);
}; void MainForm::OnMouseDown(const MouseEventArgs& e){
p1.x = e.X;
p1.y = e.Y; //...
Form::OnMouseDown(e);
} void MainForm::OnMouseUp(const MouseEventArgs& e){
p2.x = e.X;
p2.y = e.Y; if (rdoLine.Checked){
shapeVector.push_back(new Line(p1,p2));
}
else if (rdoRect.Checked){
int width = abs(p2.x - p1.x);
int height = abs(p2.y - p1.y);
shapeVector.push_back(new Rect(p1, width, height));
}
//改变
else if (...){
//...
shapeVector.push_back(circle);
} //...
this->Refresh(); Form::OnMouseUp(e);
} void MainForm::OnPaint(const PaintEventArgs& e){ //针对所有形状
for (int i = 0; i < shapeVector.size(); i++){ shapeVector[i]->Draw(e.Graphics); //多态调用,各负其责
} //...
Form::OnPaint(e);
}

在绘制点、线、矩形的问题上,分解和抽象两种思维下的解决方案是不一样的。在出现了新需求(画圆)后,两种方案应对策略也是不同的。

3.6 软件设计的目标:复用!

参考:《李建忠C++设计模式》视频

https://www.bilibili.com/video/av64805906/?p=1

学习记录:《C++设计模式——李建忠主讲》1.设计模式的更多相关文章

  1. 学习记录:《C++设计模式——李建忠主讲》2.面向对象设计原则

    1.课程内容: 重新认识面向对象:面向对象设计原则: 2.重新认识面向对象 1)理解隔离变化:从宏观层面来看,面向对象的构建方式更能适应软件的变化,将变化所带来的影响减为最小: 2)各司其职:从微观层 ...

  2. 学习记录:《C++设计模式——李建忠主讲》6.“状态变化”模式

    状态变化模式:在组件构建过程中,某些对象的状态经常面临变化,如何对这些变化进行有效的管理?同时又维持高层模块的稳定.状态变化模式为这一问题提供了一种解决方案. 典型模式:状态模式(State).备忘录 ...

  3. 学习记录:《C++设计模式——李建忠主讲》3.“组件协作”模式

    “组件协作”模式:现代软件专业分工之后的第一个结果是“框架与应用程序的划分”,“组件协作”模式通过晚期绑定,来实现框架与应用程序之间的松耦合,是二者之间协作时常用的模式.典型模式:Template M ...

  4. 学习记录:《C++设计模式——李建忠主讲》5.“对象性能”模式

    对象性能模式:面向对象很好地解决了抽象地问题,但是必不可免地要付出一定地代价.对于通常情况来讲,面向对象地成本大都可以忽略不计,但某些情况,面向对象所带来地成本必须谨慎处理. 典型模式:单件模式(Si ...

  5. 学习记录:《C++设计模式——李建忠主讲》4.“单一职责”模式

    单一职责模式:在软件组件的设计中,如果责任划分的不清晰,使用继承得到的结果往往是随着需求的变化,子类急剧膨胀,同时充斥着重复代码,这时候的关键是划清责任. 典型模式:装饰模式(Decorator).桥 ...

  6. 学习记录:《C++设计模式——李建忠主讲》7.“领域规则”模式

    领域规则模式:在特定领域中,某些变化虽然频繁,但可以抽象为某种规则.这时候,结合特定的领域,将问题抽象为语法规则,从而给出该领域下的一般性解决方案. 典型模式:解释器模式(Interpreter). ...

  7. 工厂模式(整理自李建忠<C++设计模式>视频)

    整理自李建忠<C++设计模式>视频 一.导入:"对象创建"模式和工厂模式 工厂模式只是该模式下的一种. 二.举例说明 有这样一个场景:需要在MainForm中设计一个按 ...

  8. Java设计模式学习记录-模板方法模式

    前言 模板方法模式,定义一个操作中算法的骨架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 模板方法模式 概念介绍 模板方法模式,其实是很好理解的,具体 ...

  9. Java设计模式学习记录-状态模式

    前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使 ...

随机推荐

  1. sql注入100种姿势过waf(二):过安全狗

    仅供学习交流如果你有更好的思路可以一起分享,想一起学习的进我主页 先去安全狗网站下载最新的安全狗版本 从官网下载 windwos apache版 v4.0.2395  最新版   数据库是mysql ...

  2. 9.Nginx常用模块

    1.nginx开启目录浏览 提供下载功能 默认情况下,网站返回index指定的主页,若该网站不存在主页,则将请求交给autoindex模块 如果开启autoindex模块,则提供一个下载的页面, 如果 ...

  3. ThreadPoolExecutor使用方法

    先看构造方法 ,ThreadPoolExecutor共4个构造方法: 直接看参数最多的7个参数分别代表: public ThreadPoolExecutor(int corePoolSize, int ...

  4. C#事件浅淡(1)

    最近在写C#,感觉事件这个机制很好,可是怎么实现自己定义的事件呢?查了资料有的不全有的不完整,有的太深,自己写一个简单的例子. 原则 1,定义一个事件信息类(标准的都继承EventArgs) 2.定义 ...

  5. QlikSense主题开发

    // 主题是qliksense 2018年2月版提出,4月版正式实施,其实就是去修改sense默认的.json文件和.css文件 { // 定义自定义主题是否从默认主题(Sense Classic)继 ...

  6. Spring为IOC容器注入Bean的五种方式

    一 @Import导入组件,id默认是组件的全类名 //类中组件统一设置.满足当前条件,这个类中配置的所有bean注册才能生效: @Conditional({WindowsCondition.clas ...

  7. 构建企业级数据湖?Azure Data Lake Storage Gen2实战体验(下)

    相较传统的重量级OLAP数据仓库,“数据湖”以其数据体量大.综合成本低.支持非结构化数据.查询灵活多变等特点,受到越来越多企业的青睐,逐渐成为了现代数据平台的核心和架构范式. 作为微软Azure上最新 ...

  8. CTR@模型整体架构

    1. 推荐系统 1.1 总体框架 主要包括:样本选择.数据清洗.特征提取与选择.模型训练.在线预估和排序. 1.2 目的 帮助用户找到想要的商品,挖掘数据分布. 降低信息过载. 提高站点的点击率/转化 ...

  9. 第三十二章 System V信号量(三)

    n哲学家进餐问题描述有五个哲学家,他们的生活方式是交替地进行思考和进餐,n哲学家们共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五支筷子,n平时哲学家进行思考,饥饿时便试图取其左.右最靠近 ...

  10. C语言I博客作业07

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2019-1/homework/9931 我在这个课程的目标 ...