C++设计模式:访问者模式
一、源代码:
#include<iostream>
#include<memory>
#include<vector>
using namespace std;
class Computer;
class Mouse;
class Keyboard;
class Monitor;
class ComputerPartVisitor
{
public:
virtual void visit(shared_ptr<Computer> computer) = 0;
virtual void visit(shared_ptr<Mouse> mouse) = 0;
virtual void visit(shared_ptr<Keyboard> keyboard) = 0;
virtual void visit(shared_ptr<Monitor> monitor) = 0;
virtual ~ComputerPartVisitor() = default;
};
class ComputerPartDisplayVisitor:public ComputerPartVisitor
{
public:
virtual void visit(shared_ptr<Computer> computer) override
{
cout<<"Displaying Computer."<<endl;
}
virtual void visit(shared_ptr<Mouse> mouse) override
{
cout<<"Displaying Mouse."<<endl;
}
virtual void visit(shared_ptr<Keyboard> keyboard) override
{
cout<<"Displaying Keyboard."<<endl;
}
virtual void visit(shared_ptr<Monitor> monitor) override
{
cout<<"Displaying Monitor."<<endl;
}
};
class ComputerPart
{
public:
virtual void accept(shared_ptr<ComputerPartVisitor> computerPartVisitor) = 0;
virtual ~ComputerPart() = default;
};
class Keyboard:public ComputerPart
{
public:
virtual void accept(shared_ptr<ComputerPartVisitor> computerPartVisitor) override
{
computerPartVisitor->visit(make_shared<Keyboard>(*this));
}
};
class Monitor:public ComputerPart
{
public:
virtual void accept(shared_ptr<ComputerPartVisitor> computerPartVisitor) override
{
computerPartVisitor->visit(make_shared<Monitor>(*this));
}
};
class Mouse:public ComputerPart
{
public:
virtual void accept(shared_ptr<ComputerPartVisitor> computerPartVisitor) override
{
computerPartVisitor->visit(make_shared<Mouse>(*this));
}
};
class Computer:public ComputerPart
{
public:
virtual void accept(shared_ptr<ComputerPartVisitor> computerPartVisitor) override
{
vector<shared_ptr<ComputerPart>> parts = {make_shared<Mouse>(),make_shared<Keyboard>(),make_shared<Monitor>()};
for(const auto& part:parts)
{
part->accept(computerPartVisitor);
}
computerPartVisitor->visit(make_shared<Computer>(*this));
}
};
int main()
{
shared_ptr<ComputerPart> computer = make_shared<Computer>();
computer->accept(make_shared<ComputerPartDisplayVisitor>());
}
二、运行结果:
三、吐槽:
绕的头晕,只用一个C++文件,问题很多,以后尽量不要设计写这种来回嵌套的类——两个类的定义互相包含对方,不利于维护,要降低耦合度,单向依赖