#include <iostream>
#include <string>
#include <vector>
#include <memory>
using namespace std;
class Cat; //前置声明
class Dog;
class Mouse;
class Animal
{
public:
class IVisitor //类中声明观察者类
{
public:
virtual ~IVisitor() {}
virtual void Visit(Cat* animal) = 0;
virtual void Visit(Dog* animal) = 0;
virtual void Visit(Mouse* animal) = 0;
};
private:
string name;
public:
Animal(const string& theName)
:name{ theName }
{
}
virtual ~Animal()
{
}
const string& GetName()const
{
return name;
}
virtual string Introduce() const = 0;
virtual void Accept(IVisitor* visitor) = 0; //观察者函数虚函数
};
class Cat : public Animal
{
public:
Cat(const string& theName)
:Animal{ theName }
{
}
string Introduce()const override
{
return "我是一只猫,我的名字叫\"" + GetName() + "\"。";
}
void Accept(IVisitor* visitor) override { //重写观察者函数
visitor->Visit(this);
}
};
class Dog : public Animal
{
public:
Dog(const string& theName)
:Animal{ theName }
{
}
string Introduce()const override
{
return "我是一只狗,我的名字叫\"" + GetName() + "\"。";
}
void Accept(IVisitor* visitor) override { //重写观察者函数
visitor->Visit(this);
}
};
class Mouse : public Animal
{
public:
Mouse(const string& theName)
:Animal{ theName }
{
}
string Introduce()const override
{
return "我是一只老鼠,我的名字叫\"" + GetName() + "\"。";
}
void Accept(IVisitor* visitor) override { //重写观察者函数
visitor->Visit(this);
}
};
class OnlyPrintCatVisitor :public Animal::IVisitor { //用于在主函数中进行调用
public:
void Visit(Cat* animal) override {
cout << animal->Introduce() << endl;
}
void Visit(Dog* animal) override {
}
void Visit(Mouse* animal) override {
}
};
int main()
{
auto tom = make_shared<Cat>("Tom");
auto jerry = make_shared<Mouse>("Jerry");
auto spike = make_shared<Dog>("Spike");
auto butch = make_shared<Cat>("Butch");
auto lightning = make_shared<Cat>("Lightning");
vector<shared_ptr<Animal>> friends{ tom, jerry, spike, butch, lightning };
OnlyPrintCatVisitor visitor; //依次调用
for (auto animal : friends)
{
animal->Accept(&visitor);
}
system("PAUSE");
return 0;
}