现在需要调用别人的一个接口,需要根据其返回的code字段给前端映射不同的内容,
比如code是2,7,11则给前端“A”, code是1,4,8给前端“B”,code是9则给前端等等,很多这样的code的逻辑,粗略估计有40多个判断,如果用if else会有太多。
1、想过用策略模式,但是感觉会建很多类
2、也想过建一个抽象类(包含codelist,“A”这样的属性),然后一个逻辑一个实现类,然后遍历所有的子类,判断哪个子类的codelist包含当前code,但是同样需要很多类。
不知道哪种方法好,博友有更好的意见吗?
public enum Respon
{
[Code(1,3,5)]
A,
[Code(2,4,6)]
B,
[Code(8,9)]
C
}
public class CodeAttribute:Attribute
{
public List<int> Codes { get; set; } = new List<int>();
public CodeAttribute(params int[] codes)
{
Codes.AddRange(codes);
}
}
服务启动时,创建成字典
Dictionary<int, string> dic = new Dictionary<int, string>();
Type type = typeof(Respon);
Array array = Enum.GetValues(type);
FieldInfo[] infos = type.GetFields();
foreach (Respon respon in array)
{
FieldInfo info = type.GetField(respon.ToString());
CodeAttribute attr = info.GetCustomAttribute<CodeAttribute>();
attr.Codes.ForEach(code =>
{
string value;
bool haskey = dic.TryGetValue(code, out value);
if (haskey) return;
dic.Add(code, respon.ToString());
});
}
使用的时候就通过字典使用
最后的做法和你这异曲同工之处
1、如果是业务逻辑很简单的话,我建议还是直接使用if...else来实现,没必要使用设计模式;
2、如果有一定的业务逻辑,又不想建很多类的话,可以试试享元模式。但是得分清内部状态和外部状态,内部状态实现共享,将外部状态传入享元对象中,根据外部状态生成不同的对象返回。
根据你的描述,还是觉得你没必要使用设计模式!
那就写个map 配置,然后通过接口或者抽象实现。
写代码必须“懒”,这样更清楚。让更多的活机器去干,人都干了还要机器干什么。
如果只是数字的话,还好,就用switch语句就好了,case比if简单多了
如果不是数字的 就可以想办法让他和数字建立联系然后再用switch,这样也简单,不过需要两边都商量好
如果是用python写就更简单了,直接将数据用字典类型一个一个对应然后查字典就行了
都不好,建一个字典,key是code,value是你要返回给前端的内容,这样就好了。如果非常多,可以用文件记录
枚举或者配置,推荐枚举,配置还要在程序启动的时候读
不建议用if else,stwich……case,建议建一张映射表,进行配置化,从表中取code映射的值