设计模式之访问者模式

访问者模式表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变类的前提下定义作用于这些元素的操作。
访问者模式的目的是要把处理从数据结构分离出来。很多系统可以按照算法和数据结构分开,如果这样的系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的。
UML图如下:
这里写图片描述
代码如下:

class Action
{
public:
    Action() {}
    virtual ~Action() {}
    virtual void GetManConclusion(Man* __m) {}
    virtual void GetWomanConclusion(Woman* __w) {}
};
class Amativeness : public Action
{
public:
    Amativeness() {}
    ~Amativeness() {}
    virtual void GetManConclusion(Man* __m)
    {
        std::cout << typeid(__m).name() << typeid(this).name() << ",KNOW." << std::endl;
    }
    virtual void GetWomanConclusion(Woman* __w)
    {
        std::cout << typeid(__w).name() << typeid(this).name() << ",NOT KNOW." << std::endl;
    }
};
class Failing : public Action
{
public:
    Failing() {}
    ~Failing() {}
    virtual void GetManConclusion(Man* __m)
    {
        std::cout << typeid(__m).name() << typeid(this).name() << ",Drink." << std::endl;
    }
    virtual void GetWomanConclusion(Woman* __w)
    {
        std::cout << typeid(__w).name() << typeid(this).name() << ",Cry." << std::endl;
    }
};
class Success : public Action
{
public:
    Success() {}
    ~Success() {}
    virtual void GetManConclusion(Man* __m)
    {
        std::cout << typeid(__m).name() << typeid(this).name() << ",have a great woman."<<std::endl;
    }

    virtual void GetWomanConclusion(Woman* __w)
    {`这里写代码片`
        std::cout << typeid(__w).name() << typeid(this).name() << ",do not have a great man." << std::endl;
    }
};
class Person
{
public:
    Person() {}
    virtual ~Person() {}

    virtual void Accept(Action* visitor)
    {

    }
};
class Woman : public Person
{
public:
    Woman() { }
    ~Woman() {}
    virtual void Accept(Action* visitor)
    {
        visitor->GetWomanConclusion( this);
    }
};
class Man : public Person
{
public:
    Man(){ }
    ~Man() {}
    virtual void Accept(Action* visitor)
    {
        visitor->GetManConclusion(this);
    }
};
class ObjectStructure
{
private:

    std::list<Person*> elements;
public:
    ObjectStructure() {}
    ~ObjectStructure()
    {
        elements.clear();
    }

    void Attach(Person* __p)
    {
        elements.push_back(__p);
    }

    void Detach(Person* __p)
    {
        elements.remove(__p);
    }

    void Display(Action* vistor)
    {
        for each (Person* __p in elements)
        {
            __p->Accept(vistor);
        }
    }

};
//客户端代码
ObjectStructure obj;
    Person* pMan = new Man();
    Person* pWoman = new Woman();
    obj.Attach(pMan);
    obj.Attach(pWoman);

    Action* pSuc = new Success();
    obj.Display(pSuc);

    Action* pFail = new Failing();
    obj.Display(pFail);

    Action* pAmative = new Amativeness();
    obj.Display(pAmative);

运行结果如下:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值