C++设计模式(入门)
什么是设计模式?
Christopher Alexander曾经说过:“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。”。也就是说,设计模式,是一种解决问题的一套惯用逻辑,一种经过凝练的最佳方法。设计模式在某种意义上,可以被认为是程序员所说的“轮子”,只不过它更偏向于逻辑。
为什么需要设计模式?
设计模式的目的就是提高代码的复用性。一个问题可能有很多种解决方案,写代码也是这样,一千个人有一千个哈姆雷特。虽然大家都能针对当下的问题提出一个能够accept的方案,但是问题是不断在变化的,所以解决方案进行变化改动的需求也是存在的。没有必要花费很大的精力,对类似的问题重新提出一个解决方案。最好的解决方案就是能够通用于一系列类似的问题。
什么是复用性?
复用性简单的来说,就是当问题变化时,你能够对代码做出很少的调整,就能够重新解决问题。提高复用性的关键在于抽象的逻辑思维。下面举个例子。
假设现在有这样一个需求,我需要在画布上画一条线段和一个圆形。现在分析这个需求,我们可以首先拆解为两个问题画线段和画圆形。对于线段,我们创建一个线段类,用于存储线段的两个点;对于圆形,我们创建一个圆形类,用于存储圆形的中心点和半径。随后,在画的过程中,我们将线段和圆形分别画出来。具体的逻辑可以看下面的伪代码:
struct point{
double x;
double y;
};
//创建Line类
class Line :{
public:
point p1;
point p2;
void Draw_Line();
...
};
//创建Circle类
class Circle:{
public:
point center_p;
double rudis;
void Draw_Circle();
...
};void mian(){
vector<Line>LineList;
vector<Circle>CircleList;
//绘制线段
for(auto it:LineList){
it.Draw_Line();
...
};
//绘制圆形
for(auto it:CircleList){
it.Draw_CircleList();
...
};}
在这段代码中用两个vector存储Line对象和Circle对象,然后调用这两种类的Draw()函数,在画布上绘制出所有的线段和圆。
这样写的代码是一个将问题分解的思路,以大化小然后分而治之,逻辑上会很清楚。但却不利于代码的修改和调整。也就是没有很高的复用性。举个例子,如果我需要在加一个绘制梯形的功能,为了实现这个功能,就需要对主程序进行调整。
struct point{
double x;
double y;
};
//创建Line类
class Line :{
public:
point p1;
point p2;
void Draw_Line();
...
};
//创建Circle类
class Circle:{
public:
point center_p;
double rudis;
void Draw_Circle();
...
};
/*
//创建矩形类
class Rectangle():{
public:
Line l1;
Line l2;
Line l3;
Line l4;
void Draw_Rectangle();}*/void mian(){
vector<Line>LineList;
vector<Circle>CircleList;
/*新增
vector<Rectangle> RectangleList;
*/
//绘制线段
for(auto it:LineList){
it.Draw_Line();
...
};
//绘制圆形
for(auto it:CircleList){
it.Draw_CircleList();
...
};
/*新增//绘制矩形
for(auto it:RectangleList){
it.Draw_Rectangle();
}*/}
研究一下上面的代码,除了新增Rectangle类之外,还需要新增存储Rectangle对象的容器,以及绘制Rectangle的循环,也就是在主函数里面加了一套绘制Rectangle的逻辑。
那么是否存在一种解决方案,只需要增加Rectangle类呢?也就是说,对于新增的需求,程序员只需要去实现自己的类,而不对于主程序进行任何更改。答案是存在的,面向对象的程序中的继承、多态等特性使得增加需求时,开发者只需要将注意力集中在自己的开发的模块上。话不多说,show the code.
//创建Shape类
class Shape :{
public:
Virtual ~Shape();
Virtual void Draw()=0;
···
};
struct point{
double x;
double y;
};//创建Line类
class Line: public Shape{
public:
point p1;
point p2;
void Draw();
...
};
//创建Circle类
class Circle: public Shape{
public:
point center_p;
double rudis;
void Draw();
...
};void mian(){
vector<Shape*>Shapelist;
//绘制
for(auto it:Shapelist){
it->Draw();
...
};};
对于上面的代码,将问题抽象成这样两个过程,一是将所有几何图形抽象成Shape类,然后留下Draw()函数给子类复写。在主函数中只要用vector存Shape类指针,就可以在一个循环中,将所有需要绘制的图像画出来。
关于GOF23种设计模式
在程序设计中,GOF(Gang of Four )代表的是四个著名人物,Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides,他们是书籍《设计模式:可复用面向对象软件的基础》的作者。其中提出了23中可以提高代码复用性的代码编写方法,学习他们的设计模式,能够节省我们探索高复用性代码结构的时间。
让我们一起站在巨人肩膀上学习代码。
C++设计模式(入门)相关推荐
- 设计模式入门(策略模式)
[0]README 0.1)本文部分文字描述转自 "head first 设计模式",旨在学习 设计模式入门(策略模式) 的基础知识: 0.2)本文章节4和5的source cod ...
- Head First Design Mode(2)-设计模式入门(策略模式)
该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动! 设计模式入门: 欢迎来到设计模式世界: 我们会看到设计模式的用途和优点,再看看关键的OO原则,通过实例来了解模式是如何运作的 ...
- 设计模式入门篇——EIT造型
设计模式入门篇--EIT造型 考虑了很久要不要写技术博客,因为自己文笔不是很好,而且自己也不是大牛,怕自己理解的东西给别人带来误解.但是写技术博客不仅可以记录自己学习的知识点,也可以让别人来评价你的理 ...
- 《设计模式入门》 1.简单工厂模式
简单工厂模式(Simple Factory Pattern)不属于GoF 23种设计模式,我们通常将它作为学习其他工厂模式的入门.是由一个工厂对象决定创建出哪一种产品类的实例.简单来说就是我们抽取一个 ...
- java爬山问题,关于java:不爬山不拍照设计模式入门到入坑第一课
作者爱谈话 明天是刚好来杭州的第二周,也是一个惬意的周五,很巧也是我的生日,将来的工作可能会很忙,还是会持续保持 sharing (原本昨天发的,然而还想欠缺欠缺就又拖了一天,哈哈.奥利给) [腾讯云 ...
- 设计模式入门,适配器模式,c++代码实现
// test07.cpp : Defines the entry point for the console application. // #include "stdafx.h" ...
- java helper 设计模式_必知必会的 Java 设计模式入门知识(十):外观模式
外观模式 GitHub 地址:yifanzheng/design-patterngithub.com 外观模式(Facade Design Pattern),在 GoF 的<设计模式>一 ...
- Java设计模式入门
一.什么是设计模式 设计模式是解决特定问题的一系列套路,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,具有一定的普遍性,可以反复使用.其目的是为了提高代码的可重用性.代码的可读性 ...
- 从零开始学习Java设计模式 | 设计模式入门篇:设计模式概述
在上一讲中,明确了设计模式这门课所要学习的内容之后,接下来,我们就得开始正式步入设计模式这门课的学习中了,当然,我也祝大家能在设计模式这门课程中能够学到很多东西,也不枉我这一片苦心了! 软件设计模式的 ...
- 设计模式入门(王者荣耀之设计英雄篇)
有问题或建议,欢迎留言.你们每一次点赞.批评都是我前进的动力 目录 一.你的大脑在想什么 二.欢迎来到王者荣耀之英雄设计 三.开始撸代码 四.00原则 一.你的大脑在想什么 大部分学习是一件充满乏味和 ...
最新文章
- SAP UI5 mock服务器错误排查
- 【数据结构与算法】通俗易懂说链表
- Spring Boot笔记-发送纯字符串邮件及带附件邮件
- 为Eclipse安装功能扩展插件
- 利用Python发送短信,用处多多
- 【codevs2304】【BZOJ1875】HH去散步,第一次的矩阵加速DP
- Polyfill工作笔记001---简介
- 5 天 6 亿 3000 万数据泄露,怎么做才能跑赢骗子?
- 河南理工大学计算机专业几本,2018河南理工大学是几本 是一本还是二本
- php7 电子书 下载,php7.3.8中文电子手册
- UltraEdit 注册机使用激活方法 更新:暴力破解
- 企业盈利能力五大指标之:净利率
- C语言猜数字游戏(超级详解)
- “手机到底是如何实现定位的?工作原理是什么?”
- casquette swagg:泉州故事
- CentOS 7 时区设置
- 十个必备的.NET开发小工具
- 初探巨杉分布式数据库
- 学习3d游戏建模的灵魂拷问20问,轻松征服游戏公司主美!
- 人文笔记(芒格人类误判心理学 + 韩信研究)
热门文章
- 教你搭建一个花卉识别系统(超级简单)
- 技术分享:与阻焊开窗等大的“D”字型异型焊盘PCB电测工艺研究
- 计算机病毒近年相似,计算机病毒入侵检测与防治研究 毕业论文
- 五个人捕鱼和分鱼的计算
- html 聊天室模版,WebSocket+HTML5实现在线聊天室
- socket:内核初始化及创建流(文件)详细过程
- Java中利用JMF编写摄像头拍照程序
- 白色半透明html,3DMax白色半透明窗帘,这样的材质参数是多少?
- 从制造业和质量管理领域入手,解读2023《质量强国建设纲要》
- 数字化车间智能排产调度挑战赛(一)—— 数学模型