访问者模式(行为模式)

来源:互联网 发布:c语言判断数字函数 编辑:程序博客网 时间:2024/06/05 20:37

概念
分离对象的数据和行为,使用访客模式,可以不修改类的情况下,增加操作角色和职责。
结构图
这里写图片描述

优点:
1.访问者模式使得增加新的操作变得很容易,如果一些操作依赖于一个复杂的结构对象的话,那么一般而言操作会变得很复杂,而使用访问者模式,增加新的操作意味着增加一个新的访问者类,因此变得很容易。
2.访问者模式将有关的行为集中到一个访问者对象中,而不是分散到一个个节点类中。
3.访问者模式可以跨过几个类的等级结构访问不属于同等级结构的成员类,迭代只能访问属于同一个类型等级结构的成员对象,而不能访问属于不同等级结构的对象,访问者模式可以做到这一点。
4.积累状态。每一个单独访问的访问者对象都集中了相关的行为,从而也就可以在访问过程中将执行操作的状态积累在自己的内部,而不是分散到很多的对象节点中,这是有益于系统维护的优点。
缺点
1.增加新的节点变得困难,每增加一个新的节点都意味着要在抽象访问者角色中增加一个新的抽象操作,并在每一个具体访问者类中增加相应的具体操作。
2.破坏封装。访问者模式要求访问者对象访问,并调用每一个节点对象操作,这隐含了一个对所有节点对象的要求:他们必须暴露自己的操作和内部状态,不然访问者的访问就变得没有意义了,由于访问者对象会积累访问操作所需的状态,从而使这些状态不再存储在节点对象中,这也是破坏封装的。
eg:需求:
现有一个公园,公园中有假山和人工湖,有访客A和访客B实现访客A访问假山,访客B访问人工湖。
实现:
基类:

class Visitor;class ParkElement{public:    virtual void accept(Visitor *visitor) = 0;    virtual void sight() = 0;};class Visitor{public:    virtual void visit(ParkElement *parkelement) = 0;};

具体实现类:

class ParkA :public ParkElement{public:    virtual void accept(Visitor *visitor){        visitor->visit(this);//公园接受访问者的访问    }    virtual void sight(){        cout << "公园假山" << endl;    }};class ParkB :public ParkElement{public:    virtual void accept(Visitor *visitor){        visitor->visit(this);//公园接受访问者的访问    }    virtual void sight(){        cout << "公园人工湖" << endl;    }};class VisitorA :public Visitor{public:    virtual void visit(ParkElement *parkelement){        cout << "访客A正在浏览:" ;        parkelement->sight();    }};class VisitorB :public Visitor{public:    virtual void visit(ParkElement *parkelement){        cout << "访客B正在浏览:";        parkelement->sight();    }};

Client:

int  main(void){    Visitor *vA = new VisitorA();    Visitor *vB = new VisitorB();    ParkA *pa = new ParkA();    ParkB *pb = new ParkB();    pa->accept(vA);    pb->accept(vB);    delete vA;    delete vB;    delete pa;    delete pb;    system("pause");    return 0;}

调试结果:
这里写图片描述

原创粉丝点击