设计模式简介
学习设计模式的目的:理解松耦合掌握面向对象设计模式掌握重构技法掌握GOF
可复用
手法:面向对象
本人下一步要学习架构搭建
抽象思维非常重要。
面向对象-》组件封装-》设计模式-》架构模式
面向对象
封装:隐藏内部代码
继承:复用现有代码
多态:改写对象行为
主要是变化导致
解决变化的复杂性:分解:分而治之。--》C语言,大问题分解成小问题。抽象:忽视非本质特征,去泛化和理想化对象模型。
下面是伪代码方式说明分解方式和抽象方式,对于后期需求变化修改产生的影响://分解方法 //Shape.h #pragma once //例子为伪码 //设计画图工具 //点 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 { };//分解的方法 //MainForm.cpp //分解的设计方法。 #include #include #include "Shape.h" using namespace std; class MainForm :public Form { private: Point p1; Point p2; //这个地方用的是类对象,非指针 vector lineVector; vector rectVector; //改变 vector 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 (rdoCircle.Checked) { Circle circle(); 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); }
//抽象方法---可复用 //Shape_abstract.h #pragma once class Shape { public: virtual void Draw(const Graphics& g) = 0; //虚析构函数作用:子类通过多态释放时,子类的析构函数才能被正确的调用到 virtual ~Shape() {} }; class Point { public: int x; int y; }; //所有继承都推荐用public 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(Pend.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, ...); } }; //抽象方法---可复用 //MainForm_abstract.cpp #include #include #include "shape_abstract.h" using namespace std; class MainForm : public Form { private: Point p1; Point p2; //针对所有形状----注意,这个地方用的是Shape指针 //这里面我们需要使用多态性。可能是Line Rect类型。 //如果不用指针会造成对象切割,切割成小对象…会有问题 //必须要房Shape指针 vector shapeVector; public: MainFor() { //... } 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) { //此处不能放栈对象,在MainForm的析构函数中要复制释放shapeVector中存放的堆对象指针 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(...); } //... 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); }
//用户有修改需求
软件设计的目标---》复用。
软件设计的金科玉律---复用。
东施效颦,卡米拉也是拼了,模仿戴安娜穿戴,气质却不足难媲美东施效颦,卡米拉也是拼了,模仿戴安娜穿戴,气质却不足难媲美73岁卡米拉强行撞衫戴安娜黑天鹅造型,又土又村不及半点为了赢得民众的尊重,处处模仿戴安娜,最终成赢家戴安娜成王室穿搭范本,
刘雯的穿衣搭配每个人都有自己的独特风格找到适合的搭配方式你也很美比心无野心系穿搭,毫不费力系时髦,最重要的是你知道她可以撑得起很难很复杂的设计风格,她穿的好看的你可以不种草但是她穿难看的你一定要
君子孤独而自重孤独是一种状态,是一种内心的坚守和追求。对于君子来说,孤独却是一种品格和气度。君子孤独而自重,不仅是他们的一种修养,也是他们的一种境界。君子孤独,不是因为他没有朋友,而是他拒绝了与
老了,退休金再高,也别给子女这两种钱,这不是抠门,是清醒图源自网络侵权请联系删除你心目中的退休生活是什么样?现在生活的节奏越来越快,许多人都期待着退休之后,生活节奏能够慢下来,多一点时间去享受生活的幸福。毕竟,退休对于很多人而言意味着有
今日份心情在这个世界上,每个人都会经历悲伤,失望,幸福,喜悦,的感受,当我们失去所爱之人,经历了无法承受之疼,遇到了不可逆转的挫折时,我们会被深深地击垮,每当深夜,独自一人舔舐自己身上的伤口
你摸摸我这布料,是不是做你女友的料春花秋月,是诗人们歌颂的情景,可是我对于它,却感到十分平凡。只有你嵌着梨涡的笑容,才是我眼中最美的景象。青翠的柳丝,怎能比及你的秀发碧绿涟漪,怎能比及你的眸子有时,我凝视床头你那张
相思吟(之四)文张鲁丹一hr情丝未断思天涯,浪迹四海可为家。塞北飞雪尤可爱,不逊江南盛开花。二hr日光过隙已白头,往事并未与水流。也怨月老不牵线,留下一段相思愁。三hr茫茫人海识得君,天长日久成
带你读诗会晤春天会晤春天我们走在草原上春天是一株株小草它们刚刚拱破土皮正在互相问好我们走在田野上春天是一棵棵小苗它们张开嫩嫩的嘴巴唱着绿色的歌谣我们走在树林里春天正在枝头上摇摇出一片片叶子还有待放
看了50岁的董卿,我才发现头发不过肩裙子不上膝,气质又得体对于很多爱美的女人来说,50岁这个年纪是一个大关卡,整体气质从成熟过渡到了老年。但这个年龄阶段的女性恰恰不能在穿衣上犯懒,若是搭配的太过于随意,分分钟变大妈。而在娱乐圈中也不乏50
40年后,继续撸起袖子!61岁李开复再出发,AI2。0为何引诸侯混战?每经记者赵雯琪杨昕怡每经编辑刘雪梅AI大模型赛道迎来另一名重磅创业者。3月19日下午,创新工场董事长兼首席执行官创新工场人工智能工程院院长李开复正式朋友圈官宣正在亲自筹组一个名为P
56岁周慧敏晒照片与狗狗合照晒白发,皮肤白皙侧颜好美气质佳周慧敏在自己的个人社交账号上晒出了她探访自己之前支持的一个动物慈善机构的照片,还配上了一段小长文为这个机构做了介绍。在文中,她也表示对这慈善机构里面的狗狗的喜爱,还说了自己的裤子被