什么是设计模式?

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++设计模式(入门)相关推荐

  1. 设计模式入门(策略模式)

    [0]README 0.1)本文部分文字描述转自 "head first 设计模式",旨在学习 设计模式入门(策略模式) 的基础知识: 0.2)本文章节4和5的source cod ...

  2. Head First Design Mode(2)-设计模式入门(策略模式)

    该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动! 设计模式入门: 欢迎来到设计模式世界: 我们会看到设计模式的用途和优点,再看看关键的OO原则,通过实例来了解模式是如何运作的 ...

  3. 设计模式入门篇——EIT造型

    设计模式入门篇--EIT造型 考虑了很久要不要写技术博客,因为自己文笔不是很好,而且自己也不是大牛,怕自己理解的东西给别人带来误解.但是写技术博客不仅可以记录自己学习的知识点,也可以让别人来评价你的理 ...

  4. 《设计模式入门》 1.简单工厂模式

    简单工厂模式(Simple Factory Pattern)不属于GoF 23种设计模式,我们通常将它作为学习其他工厂模式的入门.是由一个工厂对象决定创建出哪一种产品类的实例.简单来说就是我们抽取一个 ...

  5. java爬山问题,关于java:不爬山不拍照设计模式入门到入坑第一课

    作者爱谈话 明天是刚好来杭州的第二周,也是一个惬意的周五,很巧也是我的生日,将来的工作可能会很忙,还是会持续保持 sharing (原本昨天发的,然而还想欠缺欠缺就又拖了一天,哈哈.奥利给) [腾讯云 ...

  6. 设计模式入门,适配器模式,c++代码实现

    // test07.cpp : Defines the entry point for the console application. // #include "stdafx.h" ...

  7. java helper 设计模式_必知必会的 Java 设计模式入门知识(十):外观模式

    外观模式 GitHub 地址:yifanzheng/design-pattern​github.com 外观模式(Facade Design Pattern),在 GoF 的<设计模式>一 ...

  8. Java设计模式入门

    一.什么是设计模式 设计模式是解决特定问题的一系列套路,是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,具有一定的普遍性,可以反复使用.其目的是为了提高代码的可重用性.代码的可读性 ...

  9. 从零开始学习Java设计模式 | 设计模式入门篇:设计模式概述

    在上一讲中,明确了设计模式这门课所要学习的内容之后,接下来,我们就得开始正式步入设计模式这门课的学习中了,当然,我也祝大家能在设计模式这门课程中能够学到很多东西,也不枉我这一片苦心了! 软件设计模式的 ...

  10. 设计模式入门(王者荣耀之设计英雄篇)

    有问题或建议,欢迎留言.你们每一次点赞.批评都是我前进的动力 目录 一.你的大脑在想什么 二.欢迎来到王者荣耀之英雄设计 三.开始撸代码 四.00原则 一.你的大脑在想什么 大部分学习是一件充满乏味和 ...

最新文章

  1. SAP UI5 mock服务器错误排查
  2. 【数据结构与算法】通俗易懂说链表
  3. Spring Boot笔记-发送纯字符串邮件及带附件邮件
  4. 为Eclipse安装功能扩展插件
  5. 利用Python发送短信,用处多多
  6. 【codevs2304】【BZOJ1875】HH去散步,第一次的矩阵加速DP
  7. Polyfill工作笔记001---简介
  8. 5 天 6 亿 3000 万数据泄露,怎么做才能跑赢骗子?
  9. 河南理工大学计算机专业几本,2018河南理工大学是几本 是一本还是二本
  10. php7 电子书 下载,php7.3.8中文电子手册
  11. UltraEdit 注册机使用激活方法 更新:暴力破解
  12. 企业盈利能力五大指标之:净利率
  13. C语言猜数字游戏(超级详解)
  14. “手机到底是如何实现定位的?工作原理是什么?”
  15. casquette swagg:泉州故事
  16. CentOS 7 时区设置
  17. 十个必备的.NET开发小工具
  18. 初探巨杉分布式数据库
  19. 学习3d游戏建模的灵魂拷问20问,轻松征服游戏公司主美!
  20. 人文笔记(芒格人类误判心理学 + 韩信研究)

热门文章

  1. 教你搭建一个花卉识别系统(超级简单)
  2. 技术分享:与阻焊开窗等大的“D”字型异型焊盘PCB电测工艺研究
  3. 计算机病毒近年相似,计算机病毒入侵检测与防治研究 毕业论文
  4. 五个人捕鱼和分鱼的计算
  5. html 聊天室模版,WebSocket+HTML5实现在线聊天室
  6. socket:内核初始化及创建流(文件)详细过程
  7. Java中利用JMF编写摄像头拍照程序
  8. 白色半透明html,3DMax白色半透明窗帘,这样的材质参数是多少?
  9. 从制造业和质量管理领域入手,解读2023《质量强国建设纲要》
  10. 数字化车间智能排产调度挑战赛(一)—— 数学模型