行为模式主要用于解决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种 )