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下的各个类方法。