访问者模式对数据的结构和数据的操作解耦,使得独立的发生变化,传统定义数据的结构时
施加于相应的函数去响应动作。不同的访问者关注对象不同的点,需要在不同的访问者内部实现,被访问的元素需要接受不同的访问者访问:
访问者模式:表示一个作用于某对象结构中的各元素的操作,他让我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
#import <Foundation/Foundation.h>
#import <string>
#include <list>
using namespace std;
class Engine;
class Manager;
class Visitor{
public:
virtual void visitor(Engine* engine) = 0;
virtual void visitor(Manager* manager) = 0;
};
class Staff{
public:
int age;
public:
Staff(){
}
~Staff(){
}
virtual void accept(Visitor* visitor){
}
};
class Engine:public Staff{
public:
Engine(){
age = random() % 50;
}
~Engine(){
}
void accept(Visitor* visitor){
visitor -> visitor(this);
}
int getCodeLines(){
return random() % 900000;
}
int kpi(){
return random() % 10;;
}
int monthSalary(){
return random() % 20000;
}
};
class Manager:public Staff{
public:
Manager(){
age = random() % 50;
}
~Manager(){
}
void accept(Visitor* visitor){
visitor -> visitor(this);
}
int getProducts(){
return random() % 50;
}
int kpi(){
return random() % 50;
}
int monthSalary(){
return random() % 50000;
}
};
class CTOVisitor:public Visitor{
public:
virtual void visitor(Engine* engine){
NSLog(@"工程师 年龄:%d,代码数:%d",engine -> age,engine -> getCodeLines());
}
virtual void visitor(Manager* manager){
NSLog(@"经理 年龄:%d,产品数:%d",manager -> age,manager -> getProducts());
}
};
class CEOVisitor:public Visitor{
public:
virtual void visitor(Engine* engine){
NSLog(@"工程师 年龄:%d,kpi:%d",engine -> age,engine -> kpi());
}
virtual void visitor(Manager* manager){
NSLog(@"经理 年龄:%d,kpi:%d",manager -> age,manager -> kpi());
}
};
class CFOVisitor:public Visitor{
public:
virtual void visitor(Engine* engine){
NSLog(@"工程师 年龄:%d,月薪:%d",engine -> age,engine -> monthSalary());
}
virtual void visitor(Manager* manager){
NSLog(@"经理 年龄:%d,月薪:%d",manager -> age,manager -> monthSalary());
}
};
class ObjectStructure{
public:
static std::list<Staff*> getList(){
std::list<Staff*> list;
list.push_back(new Engine());
list.push_back(new Manager());
list.push_back(new Engine());
list.push_back(new Engine());
list.push_back(new Manager());
list.push_back(new Engine());
list.push_back(new Manager());
return list;
}
};
int main(int argc, const char * argv[]) {
@autoreleasepool {
Visitor* ctoVisitor = new CTOVisitor();
Visitor* ceoVisitor = new CEOVisitor();
Visitor* cfoVisitor = new CFOVisitor();
std::list<Staff*> list = ObjectStructure::getList();
NSLog(@"CTO 访问=======================");
for (std::list<Staff*>::iterator iter = list.begin(); iter != list.end() ; iter++) {
((Staff*)*iter) -> accept(ctoVisitor);
}
NSLog(@"CEO 访问=======================");
for (std::list<Staff*>::iterator iter = list.begin(); iter != list.end() ; iter++) {
((Staff*)*iter) -> accept(ceoVisitor);
}
NSLog(@"CFO 访问=======================");
for (std::list<Staff*>::iterator iter = list.begin(); iter != list.end() ; iter++) {
((Staff*)*iter) -> accept(cfoVisitor);
}
}
return 0;
}
访问者模式(根据改编而成)
最新推荐文章于 2020-06-13 23:21:06 发布