观察者模式实现案例(C++)

#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;
}

猜你喜欢

转载自blog.csdn.net/alex1997222/article/details/81274399
今日推荐