美文网首页
lxidea的 Boolan C++设计模式 第三周作业

lxidea的 Boolan C++设计模式 第三周作业

作者: lxidea | 来源:发表于2018-06-14 21:41 被阅读0次

    针对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()去调用画图的功能,而与单一对象或者组合对象无关。

    相关文章

      网友评论

          本文标题:lxidea的 Boolan C++设计模式 第三周作业

          本文链接:https://www.haomeiwen.com/subject/ihyueftx.html