学习设计模式的目的:理解松耦合掌握面向对象设计模式掌握重构技法掌握GOF 可复用 手法:面向对象 本人下一步要学习架构搭建 抽象思维非常重要。 面向对象》组件封装》设计模式》架构模式 面向对象 封装:隐藏内部代码 继承:复用现有代码 多态:改写对象行为 主要是变化导致 解决变化的复杂性:分解:分而治之。》C语言,大问题分解成小问题。抽象:忽视非本质特征,去泛化和理想化对象模型。 下面是伪代码方式说明分解方式和抽象方式,对于后期需求变化修改产生的影响:分解方法Shape。hpragmaonce例子为伪码设计画图工具点classPoint{public:};线classLine{public:PPLine(constPointstart,constPointend){}};矩形classRect{public:PointleftUp;Rect(constPointleftUp,intwidth,intheight){thisleftUpleftUp;}};有需求圆形圆形classCircle{};分解的方法MainForm。cpp分解的设计方法。includeiostreamincludevectorincludeShape。classMainForm:publicForm{private:Pointp1;Pointp2;这个地方用的是类对象,非指针vectorLinelineVvectorRectrectV改变vectorCirclecircleVpublic:MainForm(){。。。}protected:virtualvoidOnMouseDown(constMouseEventArgse);virtualvoidOnMouseUp(constMouseEventArgse);virtualvoidOnPaint(constPaintEventArgse);};voidMainForm::OnMouseDown(constMouseEventArgse){p1。xe。X;p1。ye。Y;。。。Form::OnMouseDown(e);}voidMainForm::OnMouseUp(constMouseEventArgse){p2。xe。X;p2。ye。Y;if(rdoLine。Checked){Lineline(p1,p2);lineVector。pushback(line);}elseif(rdoRect。Checked){intwidthabs(p2。xp1。x);intheightabs(p2。yp1。y);Rectrect(p1,width,height);rectVector。pushback(rect);}改变elseif(rdoCircle。Checked){Circlecircle();circleVector。pushback(circle);}。。。thisRefresh();Form::OnMouseUp(e);}界面被刷新时被调用voidMainForm::OnPaint(constPaintEventArgse){针对直线for(inti0;ilineVector。size();i){e。Graphics。DrawLine(Pens。Red,lineVector〔i〕。start。x,lineVector〔i〕。start。y,lineVector〔i〕。end。x,lineVector〔i〕。end。y);}针对矩形for(inti0;irectVector。size();i){e。Graphics。DrawRectangle(Pens。Red,rectVector〔i〕。leftUp,rectVector〔i〕。width,rectVector〔i〕。height);}改变针对圆形for(inti0;icircleVector。size();i){e。Graphics。DrawCircle(Pens。Red,circleVector〔i〕);}。。。Form::OnPaint(e);} 抽象方法可复用Shapeabstract。hpragmaonceclassShape{public:virtualvoidDraw(constGraphicsg)0;虚析构函数作用:子类通过多态释放时,子类的析构函数才能被正确的调用到virtualShape(){}};classPoint{public:};所有继承都推荐用publicclassLine:publicShape{public:PP构造函数Line(constPointstart,constPointend){}实现自己的Draw,负责画自己重写父类虚函数virtualvoidDraw(constGraphicsg){g。DrawLine(Pend。Red,start。x,start。y,end。x,end。y);}};classRect:publicShape{public:PointleftUp;Rect(constPointleftUp,intwidth,intheight){thisleftUpleftUp;}实现自己的Draw,负责画自己virtualvoidDraw(constGraphicsg){g。DrawRectangle(Pens。Red,leftUp,width,height);}};改变classCircle::publicShape{public:实现自己的Draw,负责画自己virtualvoidDraw(constGraphicsg){g。DrawCircle(Pens。Red,。。。);}};抽象方法可复用MainFormabstract。cppincludeiostreamincludevectorincludeshapeabstract。classMainForm:publicForm{private:Pointp1;Pointp2;针对所有形状注意,这个地方用的是Shape指针这里面我们需要使用多态性。可能是LineRect类型。如果不用指针会造成对象切割,切割成小对象会有问题必须要房Shape指针vectorShapeshapeVpublic:MainFor(){。。。}protected:virtualvoidOnMouseDown(constMouseEventArgse);virtualvoidOnMouseUp(constMouseEventArgse);virtualvoidOnPaint(constPaintEventArgse);};voidMainForm::OnMouseDown(constMouseEventArgse){p1。xe。X;p1。ye。Y;。。。Form::OnMouseDown(e);}voidMainForm::OnMouseUp(constMouseEventArgse){p2。xe。X;p2。ye。Y;if(rdoLine。Checked){此处不能放栈对象,在MainForm的析构函数中要复制释放shapeVector中存放的堆对象指针shapeVector。pushback(newLine(p1,p2));这个地方貌似有内存泄漏吧???}elseif(rdoRect。Checked){intwidthabs(p2。xp1。x);intheightabs(p2。yp1。y);shapeVector。pushback(newRect(p1,width,height));}改变后面使用工厂模式可以消掉elseif(。。。){。。。shapeVector。pushback(。。。);}。。。thisRefresh();Form::OnMouseUp(e);}voidMainForm::OnPaint(constPaintEventArgse){针对所有形状for(inti0;ishapeVector。size();i){shapeVector〔i〕Draw(e。Graphics);多态调用,各负其责}。。。Form::OnPaint(e);} 用户有修改需求 软件设计的目标》复用。 软件设计的金科玉律复用。