针对DrawingSystem中的基类Shape和各个子类Line、Rec、Circle,请使用某种模式来支持更复杂的形状,该复杂形状是各个形状的自由组合。使用松耦合面向对象设计方法和思想,可使用伪码表示设计。
(使用当周的设计模式,并且只使用一种设计模式)
从题目的意思来看,将来用户将会使用复杂的形状,这个形状是各个形状的自由组合。为了使用松耦合思想,让形状的接口对于用户来说能够稳定,接口对于单一对象或者是组合对象来说,都相同。因此,本周作业采用Composite模式。
还是先把Shape基类给写出来
class Shape{
virtual void draw()=0;
virtual ~Shape();
}
然后分别把Shape的各个子类Line、Rec、Circle实现出来
class Point {
public:
double x;
double y;
Point(double _x=0, double _y=0):x(_x),y(_y){};
}
class Line: public Shape {
protected:
Point p1,p2;
public:
Line():Shape(){};
virtual void draw(){
//draw line.....
}
SetStPoint(const Point& p);
SetEndPoint(const Point& p);
~Line();
}
class Rec: public Shape {
protected:
Point p;
double length;
double height;
public:
Line():Shape(){};
virtual void draw(){
//draw rectangle.....
}
setStPoint(Point& p);
setHeight(double h);
setWidth(double w);
~Rec();
}
class Circle: public Shape {
protected:
Point p;
double radius;
public:
Circle():Shape(){};
virtual void draw(){
//draw Circle.....
}
setCenter(Point& p);
setRadius(double r);
~Circle();
}
接下来,我们实现一个组合结构
class Composite: public Shape {
protected:
std::list<Shape*> shapes;
public:
Composite():Shape(){};
virtual void draw() {
for (auto s: shapes)
s->draw();
}
void addShape(Shape* s) {
shapes.add(s);
}
void removeShape(Shape* s) {
shapes.remove(s);
}
~Composite();
}
最后在DrawingSystem中
class DrawingSystem {
protected:
std::list<Shape*> myshapes;
public:
DrawingSystem();
void addShape(Shape* _shape) {
myshapes.add(_shape);
}
void removeShape(Shape* _shape) {
myshapes.remove(_shape);
delete s;
}
void draw() {
for (auto s: myshapes)
s->draw();
}
~DrawingSystem();
}
最后做一个main函数的示例
int main() {
DrawingSystem ds;
Circle c;
Rec r;
Line l;
Composite comp;
comp.addShape(&c);
comp.addShape(&r);
comp.addShape(&l);
ds.addShape(&comp);
Circle c2;
ds.addShape(&c2);
Line l2;
ds.addShape(&l2);
ds.draw();
}
这样,对于DrawingSystem来说,不管Composite是由多少种形状组合而成的,用户都只需要使用相同的接口draw()
去调用画图的功能,而与单一对象或者组合对象无关。