Qt C++ visitor模式

来源:互联网 发布:淘宝全屏海报轮播滚动 编辑:程序博客网 时间:2024/04/29 07:43

element.h

#pragma once


#include <QObject>
#include "visitor.h"


class CEmployeePrivate;
class CEmployee : public QObject
{
Q_OBJECT
Q_CLASSINFO("Author","wdj")
Q_ENUMS(ESex)
Q_ENUMS(EGalatyType)
Q_PROPERTY(QString name READ getName WRITE setName)
Q_PROPERTY(ESex sex READ getSex WRITE setSex)
Q_PROPERTY(EGalatyType salary READ getSalary WRITE setSalary)
public:
CEmployee();
~CEmployee();

enum ESex
{
eMan = 0,
eWoman,
};


enum EGalatyType
{
eHigh = 0,
eMid,
eLow,
};

QString getName();
void setName(const QString &name);


ESex getSex();
void setSex(ESex sex);


EGalatyType getSalary();
void setSalary(EGalatyType galary);

virtual QString acceptSalary(CVisitor *visitor) = 0;
private:
CEmployeePrivate *d_ptr;
Q_DECLARE_PRIVATE(CEmployee)
};


class CManagerElement : public CEmployee
{
public:
CManagerElement(){};
QString acceptSalary(CVisitor *visitor)
{
qDebug() << "this is a manager";
return visitor->visitSalary(this);
}


};


class CCommandElement : public CEmployee
{
public:
CCommandElement(){};
QString acceptSalary(CVisitor *visitor)
{
qDebug() << "this is a commader";
return visitor->visitSalary(this);
}
};

element.cpp

#include "element.h"


class CEmployeePrivate
{
Q_DECLARE_PUBLIC(CEmployee)
CEmployee *q_ptr;


public:
CEmployeePrivate(){};
QString m_name;
CEmployee::ESex m_sex;
CEmployee::EGalatyType m_salary; 
};


CEmployee::CEmployee()
{
d_ptr = new CEmployeePrivate();
d_ptr->q_ptr = this;
}


CEmployee::~CEmployee()
{
delete d_ptr;
}


QString CEmployee::getName()
{
return d_ptr->m_name;
}


void CEmployee::setName(const QString &name)
{
d_ptr->m_name = name;
}


CEmployee::ESex CEmployee::getSex()
{
return d_ptr->m_sex;
}


void CEmployee::setSex(ESex sex)
{
d_ptr->m_sex = sex;
}


CEmployee::EGalatyType CEmployee::getSalary()
{
return d_ptr->m_salary;
}


void CEmployee::setSalary(EGalatyType galary)
{
d_ptr->m_salary = galary;
}


#include "moc_element.cpp"

visitor.h

#pragma once


#include <QDebug>
#include <QVariant>


class CEmployee;


class CVisitor
{
public:
~CVisitor(){}
virtual QString visitSalary(CEmployee *elm) = 0;


protected:
CVisitor(){}
};


class CManagerVisitor : public CVisitor
{
public:
CManagerVisitor(){};
~CManagerVisitor(){};


QString visitSalary(CEmployee *elm);
};


class CCommanderVisitor : public CVisitor
{
public:
CCommanderVisitor(){};
~CCommanderVisitor(){};


QString visitSalary(CEmployee *elm);
};

visitor.cpp



#include "visitor.h"
#include "element.h"


QString CManagerVisitor::visitSalary(CEmployee *elm)
{
if (elm->property("sex").toInt() == CEmployee::eMan)
{
return "6000";
}
return "4800";
}


QString CCommanderVisitor::visitSalary(CEmployee *elm)
{
if (elm->property("sex").toInt() == CEmployee::eMan)
{
return "12000";
}
return "8500";
}

main,cpp

#include <QApplication>
#include "element.h"


int main(int argc,char **argv)
{
QApplication app(argc,argv);


CEmployee *manager = new CManagerElement;
CEmployee *commder = new CCommandElement;
manager->setProperty("sex",CEmployee::eMan);
commder->setProperty("sex",CEmployee::eWoman);


CVisitor *mv = new CManagerVisitor;
CVisitor *cv = new CCommanderVisitor;


QString msalary = manager->acceptSalary(mv);
QString csalary = commder->acceptSalary(cv);

delete manager;
delete commder;
delete mv;
delete cv;


return app.exec();
}