栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++设计模式(入门)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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(){
vectorLineList;
vectorCircleList;
//绘制线段
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();
...
};



void mian(){
vectorLineList;
vectorCircleList;

//绘制线段
for(auto it:LineList){
it.Draw_Line();
...
};
//绘制圆形
for(auto it:CircleList){
it.Draw_CircleList();
...
};


}

研究一下上面的代码,除了新增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(){
vectorShapelist;
//绘制
for(auto it:Shapelist){
it->Draw();
...
};

};

对于上面的代码,将问题抽象成这样两个过程,一是将所有几何图形抽象成Shape类,然后留下Draw()函数给子类复写。在主函数中只要用vector存Shape类指针,就可以在一个循环中,将所有需要绘制的图像画出来。

关于GOF23种设计模式

在程序设计中,GOF(Gang of Four )代表的是四个著名人物,Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides,他们是书籍《设计模式:可复用面向对象软件的基础》的作者。其中提出了23中可以提高代码复用性的代码编写方法,学习他们的设计模式,能够节省我们探索高复用性代码结构的时间。

让我们一起站在巨人肩膀上学习代码。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769525.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号