23个设计模式(课1)

在B站学习设计模式,主讲人是李建忠老师,讲解的很不错,结合代码一起讲,比较容易理解。

知识点

  1. 代码的思维/人类的思维,包含两个主要方向:底层思维和抽象思维。底层就是代码是如何具体实现,如图在硬件上实现的原理和方法;抽象就是把具有相同属性的对象,归纳到同一个类别中,也就是抽象,比如各种图形:圆形,矩形,三角形。
  2. 面对对象的三大机制:封装,继承,多态。
  3. 解决复杂性:分而治之,抽象。
  4. 软件设计最大的目标:可复用!

代码

采用分解的思想 MainFrom1.cpp,对不同的类,采用if else 来判断,使用不同的实现方式。

class MainForm : public Form {
private:
   Point p1;
   Point p2;

   vector<Line> lineVector;
   vector<Rect> rectVector;
   //改变
   vector<Circle> 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 (...){
   	//...
   	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);
}

采用OOP的方式。MainFrom2.cpp
对不同类的实现方式,在头文件中,用虚函数来定义,在子类中用继承虚函数的多态来实现这些方法。

class MainForm : public Form {
private:
	Point p1;
	Point p2;

	//针对所有形状
	vector<Shape*> shapeVector;

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){
		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(circle);
	}

	//...
	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);
}


已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页