1. 程式人生 > >訪問器模式

訪問器模式

std 耦合 class spl his accep del com blog

訪問器(visitor)模式

意圖:主要將數據結構與數據操作分離。
主要解決:穩定的數據結構和易變的操作耦合問題。

代碼:

#include <iostream>
#include <list>
using namespace std;

class ComputerPartVisitor;

class ComputerPart
{
public:
    virtual ~ComputerPart() {}
public:
    virtual void accept(ComputerPartVisitor *v) = 0;
};

class KeyBoard;
class Mouse; class Monitor; class ComputerPartVisitor { public: virtual ~ComputerPartVisitor() {} public: virtual void visit(KeyBoard *keyboard) = 0; virtual void visit(Mouse *mouse) = 0; virtual void visit(Monitor *monitor) = 0; }; class KeyBoard : public ComputerPart { public: virtual
void accept(ComputerPartVisitor *v) { v->visit(this); } }; class Mouse : public ComputerPart { public: virtual void accept(ComputerPartVisitor *v) { v->visit(this); } }; class Monitor : public ComputerPart { public: virtual void accept(ComputerPartVisitor *v) { v
->visit(this); } }; class ComputerPartDisplayVisitor : public ComputerPartVisitor { public: virtual void visit(KeyBoard *keyboard) { cout << "Displaying KeyBoard." << endl; } virtual void visit(Mouse *mouse) { cout << "Displaying Mouse." << endl; } virtual void visit(Monitor *monitor) { cout << "Displaying Monitor." << endl; } }; class Computer { public: Computer() { _computerPartList.clear(); addComponent(new KeyBoard); addComponent(new Mouse); addComponent(new Monitor); } ~Computer() { for (auto it = _computerPartList.begin(); it != _computerPartList.end(); ++it) { delete *it; } _computerPartList.clear(); } public: void addComponent(ComputerPart *cp) { _computerPartList.push_back(cp); } void accept(ComputerPartVisitor *v) { for (auto it = _computerPartList.begin(); it != _computerPartList.end(); ++it) { (*it)->accept(v); } } private: list<ComputerPart*> _computerPartList; }; void test() { Computer *c = new Computer(); ComputerPartVisitor *visitor = new ComputerPartDisplayVisitor(); c->accept(visitor); delete c; delete visitor; } int main() { test(); cin.get(); return 0; }

效果:

技術分享

訪問器模式