课程目标:
什么是设计模式
“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次的使用该方案而不必做重复劳动”。
—Christopher
GOF设计模式:
从面向对象谈起:
深入理解面向对象:
软件设计固有的复杂性
软件设计复杂的根本原因:
如何解决复杂性:
结构化 VS 面向对象
分解
Shape.h
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;
}
};
MainForm.cpp
class MainForm : public Form {
private:
Point p1;
Point p2;
vector<Line> lineVector;
vector<Rect> rectVector;
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);
}
//...
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);
}
//...
Form::OnPaint(e);
}
抽象
Shape2.h
class Shape {
public:
virtual void Draw(const Graphics& g) = 0;
virtual ~Shape();
};
class Point {
public:
int x;
int y;
};
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(Pens.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);
}
}
};
MainForm2.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) {
lineVector.push_back(new Line(p1, p2););
}
else if (rdoRect.Checked) {
int width = abs(p2.x - p1.x);
int height = abs(p2.y - p1.y);
rectVector.push_back(new Rect(p1, width, height));
}
//...
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);
}
改变:增加圆
Shape.h
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
class MainForm : public Form {
private:
Point p1;
Point p2;
vector<Line> lineVector;
vector<Rect> rectVector;
//改变
vector<Circle> rectVector;
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);
}
抽象
Shape2.h
class Shape {
public:
virtual void Draw(const Graphics& g) = 0;
virtual ~Shape();
};
class Point {
public:
int x;
int y;
};
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(Pens.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,
...);
}
}
MainForm2.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(new 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);
}