C语言实现设计模式之行为模式:访问者模式

行为模式主要用于解决if--else过多的问题

访问者模式一般用于输出仅与本次输入输入有关,与以前的输入无关。

输入的对象是多变的,而类似。

但是处理的方法可以自由指定,具体处理方法根据输入自动调整

举例:一个公司有各种类型的员工,各个部门统计员工信息也是不一样的

将处理方法作为参数传入

一般方法

typedef struct{
   int type;
   int id;
   ....
  }Employee;
enum{ FULL_TIME,PART_TIME}EmployeeType;
enum{HR,FR}DepartmentType;
void handle(Employee *e,DepartmentType dpn ){
  
   while(*l){
       if(dpn==HR){//人事部
           if(e->type==FULL_TIME){
             ...
            }else if(e->type==PART_TIME){
             ...          
            }
 
       }else if(dpn==FR){//财务部
        ...
        ...    
      }
      l++;
   } 
}

可以看成处理函数非常复杂,员工类型越多,部门越多越难以修改和扩充 

 访问者结构

基本接口,一次定义不用修改了

#ifndef VISTER_H
#define VISTER_H
typedef struct{
   int type;
   int id;
   ....
  }Employee;
void handle(Employee *,Vister);
#endif
#include“vister.h”
void handle(Employee *e,Vister vister ){//数据与数据处理分开
         vister(e);
 }
#ifndef EMPLOYRR_TYPE_H
#define EMPLOYRR_TYPE_H
/*
有新的员工类型请在此添加
*/
typedef enum{FULL_TIME=0,PART_TIME}EmployeeType;
#endif

 下面是处理函数,以其中一个部门(人事部)为例:

#include"employee.h"
#include"employeetype.h"
void HRDepartment(Employee *e){
     if(e->type==FULL_TIME){
             ...
     }else if(e->type==PART_TIME){
             ...          
     }
}

 /***另一个版本*,建议采用********************/

#include"employee.h"
#include"employeetype.h"
static fullTime(Employee *e){
     ...
}
static partTime(Employee *e){
     ...
}
/*
有新类型员工处理函数请在此添加,并建函数名加入my中
*/
static void(* my[])(Employee *)={//添加函数名时,注意顺序应与员工类型代码顺序一致
  fullTime,
  partTime
};

void HRDepartment(Employee *e){
     assert(e>0 && e->type>=0 && e->type<=PART_TIME &&"员工或员工类型不存在!");
     my[e->type](e);
}

其他的访问者与此类似,随着访问者的不同还可以继续扩充。

访问者模式和策略模式真像!

访问者模式将访问者和数据分开,策略也是!

但是访问者可能有多个(策略可能有多个),处理的数据多种而相似(策略模式一般是1种 )

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值