【GeekBand】C++设计模式笔记1_介绍

news2024/9/21 17:56:33

课程目标

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

什么是设计模式

在这里插入图片描述
目标复用,以不变应万变

GOF设计模式

在这里插入图片描述

从面向对象谈起

在这里插入图片描述

深入理解面向对象

  • 向下:深入理解三大面向对象机制
    • 封装:隐藏内部实现
    • 继承:复用现有代码
    • 多态:改写对象行为
  • 向上:深刻把握面向对象机制所带来的抽象意义,理解如何使用这些机制来表达现实世界,掌握什么是“好的面向对象设计”

软件设计固有的复杂性

在这里插入图片描述

软件设计复杂的根本原因

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

如何解决复杂性

  • 分解
    • 人们面对复杂性有一个常见的做法:即分而治之,将大问题分解为多个小问题,将复杂问题分解为多个简单问题。
  • 抽象
    • 更高层次来讲,人们处理复杂性有一个通用的技术,即抽象。由于不能掌握全部的复杂对象,我们选择忽视它的非本质细节,而去处理泛化和理想化了的对象模型。

结构化 VS. 面向对象

  • 分解:将问题具体化
/*
* @file: 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 {

};
/*
* @file: MainForm1.cpp
*/

class MainForm : public Form {
private:
	Point p1;
	Point p2;

	vector<Line> lineVector;	// 直线
	vector<Rect> rectVector;	// 矩形
	// 改变
	// 增加一个vector专门存储圆
	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);
}
  • 抽象:运用面向对象的继承多态特性,使用统一的处理方式,来提高代码的复用性
/*
* @file: Shape2.h
*/

// 基类
class Shape {
public:
	// 虚函数,由子类override
	virtual void Draw(const Graphics& g) = 0;
	
	// 析构函数也要是virtual
	virtual ~Shape() { }
};

class Point {
public:
	int x;
	int y;
};

// 派生类:继承Shape
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);
	}
};

// 派生类:继承Shape
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,
			...);
	}
};
/*
* @file: MainForm2.cpp
*/

class MainForm : public Form {
private:
	Point p1;
	Point p2;

	// 针对所有形状,注意:这里是基类指针Shape*,而非基类对象;
	// 目的是利用多态,用父类指针指向子类对象,vector中可以存储所有子类对象的指针
	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));	// 将Line*指针放入shapeVector中
	}
	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));	// 将Rect*指针放入shapeVector中
	}
	// 改变
	else if (...){
		// ...
		shapeVector.push_back(circle);	// 将Circle*指针放入shapeVector中
	}

	// ...
	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);
}

软件设计的目标

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2127540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux驱动开发-磁盘管理

在Linux系统中&#xff0c;mount命令是一种非常常见且有用的工具&#xff0c;用于将文件系统连接到指定的挂载点。通过使用mount命令&#xff0c;管理员可以访问和管理存储设备上的文件和目录&#xff0c;包括硬盘驱动器、CD或DVD驱动器、闪存驱动器等。 一、mount基本语法 mo…

非线性规划及其MATLAB实现

目录 引言 非线性规划的基本模型 非线性规划的求解方法 非线性规划的MATLAB实现 例子&#xff1a;多目标优化问题的非线性规划求解 表格总结&#xff1a;MATLAB常用非线性规划函数 实例&#xff1a;使用MATLAB求解非线性投资决策问题 结论 引言 非线性规划&#xff08;…

Haskell中的数据交换:通过http-conduit发送JSON请求

无论是客户端与服务器之间的通信&#xff0c;还是服务之间的API调用&#xff0c;都需要一种高效、可靠的方法来传输数据。在众多编程语言中&#xff0c;Haskell以其强大的类型系统和函数式编程特性&#xff0c;为构建可靠和高效的数据交换提供了坚实的基础。本文将介绍如何在Ha…

基于ssm+vue+uniapp的食堂线上预约点餐系统小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

亚信安慧AntDB-M 只读事务提交优化

一、事务操作介绍 数据库系统一般有三种开启和提交事务方法&#xff1a; 配置autocommit1时&#xff0c;隐式开启事务&#xff0c;每执行一条DML的SQL语句&#xff0c;数据库系统会隐式的自动执行commit逻辑提交事务&#xff0c;不需要用户输入commit执行提交。 配置autocomm…

Qt第三课 ----------按钮的控件属性

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

视频推拉流/直播点播EasyDSS平台安装失败并报错“install mediaserver error”是什么原因?

TSINGSEE青犀视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务&#xff0c;在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外&#xff0c;平台还支持用户自行上传视频文件&#xff0c;也可…

openeuler-无法dnf安装包问题

有个openEuler release 22.09系统机器&#xff0c;需要dnf安装些包等 [rootlydb ~]# more /etc/openEuler-release openEuler release 22.09 [rootlydb ~]# dnf -y install lrzsz OS …

【C++】Stack

个人主页~ Stack 一、Stack的介绍和使用1、stack的介绍2、stack的使用3、stack的模拟实现 二、容器适配器1、什么是适配器2、容器适配器的使用 三、deque1、原理介绍2、deque的使用3、deque的缺陷 一、Stack的介绍和使用 1、stack的介绍 stack详细解释 stack是一种容器适配器…

onlyoffice 使用记录(前端开发角度)

前端和Web文档生成器服务器交互 对于与 Web 文档生成器服务的交互&#xff0c;使用 POST 请求。 请求参数在请求正文中以 JSON 格式输入。 请求被发送到 https://documentserver/docbuilder 地址&#xff0c;其中 documentserver 是安装了 ONLYOFFICE 文档服务器的服务器的名称…

创新实验报告VC++案例开发十二生肖的俄罗斯方块智力游戏完整代码设计方案

一&#xff0e;项目名称 十二生肖俄罗斯方块 二&#xff0e;开发背景&#xff1a; 俄罗斯方块是一个很低古老的一个小游戏&#xff0c;到但今日它还有很大的魅力。 三&#xff0e;技术路线或工作原理&#xff1a; 采用的软件及开发平台 Micosoft Visual 6.0 项目的总体方…

1.安卓逆向-说明

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 正常来爬一个app的数据&#xff0c;在没有加密的情况下&#xff0c;就不需要去逆向&#xff0c;app没有加密也就可以正…

SprinBoot+Vue高校就业管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

RickdiculouslyEasy--CTF-综合靶场

废话不多说&#xff0c;一个靶机&#xff0c;好几个flag&#xff0c;开整&#xff01;&#xff01;&#xff01; 使用命令如下&#xff0c;来进行主机发现。 netdiscover -r 172.16.1.10 找到目标靶机 扫描端口 nmap 172.16.1.7 -p 1-65535 依次访问 第一个flag 9090端口 第…

使用CUBE_MX实现STM32 DMA 功能(存储器到存储器)

目录 一、使用DMA实现从存储器1发送数据到存储器2中 1.CUBE_MX配置 2.KEIL5配置 一、使用DMA实现从存储器1发送数据到存储器2中 1.CUBE_MX配置 1.在DMA选项中添加MEMORY TO MEMORY 选择数据宽度&#xff0c;并确保地址递增功能打开。 2.系统时钟72MHz 3.生成代码 2.KEIL5配…

创建Django 项目

创建一个新的 Django 项目&#xff1a; django-admin startproject myproject cd myproject 在 Django 项目中创建一个新的应用&#xff1a; python manage.py startapp myapp设置数据库 编辑 myproject/settings.py 文件中的数据库设置&#xff1a; DATABASES {default:…

研究: 用于训练大型语言模型的数据集往往缺乏透明度

研究人员开发了一种易于使用的工具&#xff0c;使人工智能从业人员能够找到适合其模型目的的数据&#xff0c;从而提高准确性并减少偏差。 这款名为 “数据出处资源管理器”(Data Provenance Explorer) 的新工具可以帮助从业人员在训练模型时对数据做出更明智的选择。 为了训练…

随机规划及其MATLAB实现

目录 引言 随机规划的基本模型 随机动态规划 随机动态规划建模实例​(随机动态规划)&#xff1a; MATLAB中的随机规划实现 示例&#xff1a;两阶段随机规划 表格总结&#xff1a;随机规划求解方法与适用场景 结论 引言 随机规划&#xff08;Stochastic Programming&…

SpringCloud之配置中心svn示例和refresh

SpringCloud之配置中心svn示例和refresh 上一篇配置中心git示例留了一个小问题&#xff0c;当重新修改配置文件提交后&#xff0c;客户端获取的仍然是修改前的信息&#xff0c;这个 问题我们先放下&#xff0c;待会再讲。国内很多公司都使用的svn来做代码的版本控制&#xff…

LabVIEW项目硬件设备选择

在LabVIEW开发项目中&#xff0c;硬件设备的选择至关重要&#xff0c;直接影响系统的性能、稳定性和开发效率。合适的硬件设备不仅能够有效支持项目目标的实现&#xff0c;还能提高整体测试和控制系统的灵活性。因此&#xff0c;从性能需求、兼容性、成本、扩展性等多个角度出发…