到腾飞家看房子

2016/10/5 赔房真爽

Posted by WangXiaoDong on October 5, 2016

时间:2016年10月5日 天气:晴:sunny:


Author:冬之晓:angry:
Email: 347916416@qq.com

    今天,一早,我就应邀去了腾飞家看他家分的房子,但是他已经走了,于是我就和他开启微信共享位置,然后他骑着电动车跟我汇合。
    之后来到了他家的新房子,他让我和辰晨给他建议如何装修房子。于是我们就在他家的房子里面一直给他建议,他家的这个房子有140平方米,
    还是很大的。这边的房子是因为他们以前的家需要改建,因此要赔的房子。当时他家有自己盖的四层小楼,因此可以赔付大概两套这么大的房子。
    感觉挺好的,这样就不用自己花钱买房子了。经过今天一天的观察,我终于发现原来装修房子也这么的费心啊,以后如果需要装修房子的话可以请教腾飞,
    有时候感觉以后能够在外面租房子住就可以了,果然我太懒了,囧。中午和晚上腾飞又请客吃饭了,下次我一定要请他吃饭,
    主要是每次腾飞付钱时都太快了,让我跟不上节奏。

今天,终于到了设计模式学习的最后一节了,完成了今天的学习,设计模式的学习也就告一段落了,以后只要没事复习一下应该就好,下一阶段,我准备开始数据结构的学习和C++基本范式中的模板范式的学习,加油!

设计模式(二十八)————访问者模式

访问者模式:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

我们使用男人和女人在成功和失败时的不同表现举例子:

#ifndef PERSONSTATE
#define PERSONSTATE
#include <QtDebug>
#include <QString>
#include <QList>

class Man;
class Woman;
class Action
{
public:
    virtual void getManConclusion(Man *concreteElementA) = 0;
    virtual void getWomanConclusion(Woman *concreteElementB) = 0;
    virtual QString getName(){return _name;}
    virtual ~Action() = default;
private:
    QString _name;
};
class Person
{
public:
    virtual void Accept(Action *visitor) = 0;
    virtual QString getName(){return _name;}
private:
    QString _name;
};
class Success final : public Action
{
public:
    void getManConclusion(Man *concreteElementA) override;
    void getWomanConclusion(Woman *concreteElementB) override;
    QString getName() override {return _name;}   //注意:虽然子类和父类这个函数样子一样,但是必须重写,否则返回的是父类的_name!!
private:
    QString _name = "成功";
};
class Failing final : public Action
{
public:
    void getManConclusion(Man *concreteElementA) override;
    void getWomanConclusion(Woman *concreteElementB) override;
    QString getName() override {return _name;}
private:
    QString _name = "失败";
};
class Amativeness final : public Action
{
public:
    void getManConclusion(Man *concreteElementA) override;
    void getWomanConclusion(Woman *concreteElementB) override;
    QString getName() override {return _name;}
private:
    QString _name = "恋爱";

};
class Man final : public Person
{
public:
    void Accept(Action *visitor)
    {
        visitor->getManConclusion(this);
    }
    QString getName() override {return _name;}
private:
    QString _name = "男人";
};
class Woman:public Person
{
public:
    void Accept(Action *visitor)
    {
        visitor->getWomanConclusion(this);
    }
    QString getName() override {return _name;}
private:
    QString _name = "女人";
};

class ObjectStructure
{
public:
    void Attach(Person *p){_elements.append(QSharedPointer<Person>(p));}
    void Detach(Person *p)
    {
        foreach (auto iterator, _elements)
        {
            if(iterator.data() == p)
            {
                _elements.removeOne(iterator);   //QSharedPointer实现了operator==()函数,因此可以这样用。
                break;
            }
        }
    }
    void Display(Action *a)
    {
        for(auto e :_elements)
        {
            e->Accept(a);
        }
    }
private:
    QList<QSharedPointer<Person>> _elements;
};

#endif // PERSONSTATE

#include "personstate.h"

void Success::getManConclusion(Man *concreteElementA)
{
    qDebug()<<concreteElementA->getName()<<getName()<<"时,背后多半有一个伟大的女人!";
}
void Success::getWomanConclusion(Woman *concreteElementB)
{
    qDebug()<<concreteElementB->getName()<<getName()<<"时,背后多半有一个不成功的男人!";
}
void Failing::getManConclusion(Man *concreteElementA)
{
    qDebug()<<concreteElementA->getName()<<getName()<<"时,闷头喝酒,谁也不用劝!";
}
void Failing::getWomanConclusion(Woman *concreteElementB)
{
    qDebug()<<concreteElementB->getName()<<getName()<<"时,泪眼汪汪,谁也劝不了!";
}
void Amativeness::getManConclusion(Man *concreteElementA)
{
    qDebug()<<concreteElementA->getName()<<getName()<<"时,凡事不懂也要装懂!";
}
void Amativeness::getWomanConclusion(Woman *concreteElementB)
{
    qDebug()<<concreteElementB->getName()<<getName()<<"时,遇事懂装作不懂!";
}

有了人的抽象,和不同情况下动作的抽象,即可在main函数中这样举例:

#include "personstate.h"
#include <QtDebug>

int main()
{
    ObjectStructure *o = new ObjectStructure();
    Man *a = new Man();
    Woman *b = new Woman();
    o->Attach(a);
    o->Attach(b);
    //成功时的反应
    Success *v = new Success;
    o->Display(v);
    //失败时 的反应
    Failing *f = new Failing;
    o->Display(f);
    //恋爱时的反应
    Amativeness *am = new Amativeness;
    o->Display(am);
    //结婚时的反应
    Marriage *m = new Marriage;
    o->Display(m);
    return 0;
}

由代码可以看出,代码关键在于人只分为男人和女人,这个性别分类是稳定的,因此可以在状态类中增加“男人反应”和“女人反应”两个方法,方法的个数就稳定。而人的抽象类中有一个抽象方法“接受”,它用来获得“状态”对象这个访问者。每一个具体状态实现对于不同性别的人对应的两个方法。这样就实现了访问者模式。

最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/menAndWomen_Visitor_pattern_28