C++面向对象编程分享10----观察者模式

来源:互联网 发布:淘宝店铺封面大全图片 编辑:程序博客网 时间:2024/05/16 11:01


visitor.h

#include <iostream>using namespace std;class Visitor;class Shape{public:// drawSystme为已确知需要的方法virtual void draw() = 0;// 通过下面的accept方法,为Shape的子类增加一个或多个方法virtual void accept(Visitor *visitor) = 0;public:virtual ~Shape(){cout << "Destructor of Shape" << endl;}};class Rectangle : public Shape{public:void draw();void accept(Visitor *visitor);public:~Rectangle(){cout << "Destructor of Rectangle" << endl;}};class Circle : public Shape{public:void draw();void accept(Visitor *visitor);public:~Circle(){cout << "Destructor of Circle" << endl;}};class Line : public Shape{public:void draw();void accept(Visitor *visitor);public:~Line(){cout << "Destructor of Line" << endl;}};class Visitor{public:virtual void visit(Rectangle *shape) = 0;virtual void visit(Circle *shape) = 0;virtual void visit(Line *shape) = 0;public:virtual ~Visitor(){cout << "Destructor of Visitor" << endl;}};class FillVisitor : public Visitor{public:void visit(Rectangle *shape){cout << "added Fill() method for Rectangle" << endl;}void visit(Circle *shape){cout << "added Fill() method for Circle." << endl;}void visit(Line *shape){cout << "added Fill() method for Line." << endl;}public:~FillVisitor(){cout << "Destructor of FillVisitor" << endl;}};class AddTextVisitor : public Visitor{public:void visit(Rectangle *shape){cout << "added AddText() method for Rectangle" << endl;}void visit(Circle *shape){cout << "added AddText() method for Circle" << endl;}void visit(Line *shape){cout << "added AddText() method for Line" << endl;}public:~AddTextVisitor(){cout << "Destructor of AddTextVisitor" << endl;}};// Visitor.cpp#include "visitor.h"void Rectangle::draw(){cout << "Rectangle::draw()" << endl;}void Rectangle::accept(Visitor *visitor){visitor->visit(this);      }void Circle::draw(){cout << "Circle::draw()" << endl;}void Circle::accept(Visitor *visitor){visitor->visit(this);      }
visitor.cpp

#include "visitor.h"int main(){Visitor *visitor1 = new FillVisitor();Shape *rectangle = new Rectangle();rectangle->draw();rectangle->accept(visitor1);Shape *circle = new Circle();rectangle->draw();circle->accept(visitor1);cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;Visitor *visitor2 = new AddTextVisitor();rectangle->accept(visitor2);circle->accept(visitor2);cout << "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" << endl;delete visitor1;delete visitor2;delete rectangle;delete circle;system("pause");return 0;}

观察者模式的基本结构如下:


首先,shape先留个方法,可以接入新的内容,里面的参数是Visitor接口,  Visitor有visit方法,有各种类继承Visitor,也就是继承visit方法。

而调用时,可以用Rec::accept(Visitor* ),定义域来具体实现shape下的各个类方法。

1 0
原创粉丝点击