访问者模式(根据改编而成)

    访问者模式对数据的结构和数据的操作解耦,使得独立的发生变化,传统定义数据的结构时
施加于相应的函数去响应动作。不同的访问者关注对象不同的点,需要在不同的访问者内部实现,被访问的元素需要接受不同的访问者访问:
     访问者模式:表示一个作用于某对象结构中的各元素的操作,他让我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值