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种 )