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();
}