策略模式
是指定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到其他使用算法的用户;
可以避免多重的if else 判断语句
1.加入系统中有很多类,而他们的区别仅仅在于他们的行为不同
2.一个系统需要动态的在几种算法中选择一种
优点:
1、策略模式符合开闭原则。
2、避免使用多重条件转移语句,如 if…else…语句、switch 语句
3、使用策略模式可以提高算法的保密性和安全性。
缺点:
1、客户端必须知道所有的策略,并且自行决定使用哪一个策略类。
2、代码中会产生非常多策略类,增加维护难度。
实际使用:比如前端菜单 分不同的子系统,不同子系统不同的展示菜单的效果,然后每个子系统中还有着重复的实现效果。
新建一个实体类,存储定义固定的值和对应的实现方法。
@Data
public class CommonVO {
//这里需要定义好所有的子系统,然后根据code,去分配对应的所属类型,然后进行调用不同的方法
private static Map<String, CommonMenuData> strategyMap=new HashedMap();
private interface CommonKey{
String AJ="AJ";//A系统
String BJ="BJ";//B系统
String CJ="CJ";//C系统
}
static{
strategyMap.put(CommonVO.CommonKey.AJ,new CommmonAData());
strategyMap.put(CommonVO.CommonKey.BJ,new CommmonBData());
strategyMap.put(CommonVO.CommonKey.CJ,new CommmonCData());
}
public static Map<String, CommonMenuData> getStrategyMap() {
return strategyMap;
}
}
然后定义个接口,所有不同菜单系统都实现这个接口即可(这里的都是共同方法)
public interface CommonMenuData {
//定义公共返回的接口集(每个子系统的内容返回不一样,当然也可以统一)
Object resultCommonData(String code);
}
然后具体实现-----A系统内容
@Component
public class CommmonAData implements CommonMenuData {
//参数自定义就好,但是code一定要传
@Override
public Object resultCommonData(String code) {
//TODO
return "A系统菜单";
}
}
然后具体实现-----B系统 内容 (C系统也一样省略。。。)
@Component
public class CommmonBData implements CommonMenuData {
//参数自定义就好,但是code一定要传
@Override
public Object resultCommonData(String code) {
//TODO
return "B系统菜单";
}
}
写一个策略类
public class CommonDataStrategy {
//调用具体每个对应的类方法
public Object show(CommonGzpData commmondata, String code){
return commmondata.resultCommonData(code);
}
}
写一个controller就可以调用了
@GetMapping("/commonData")
@ApiOperation(value = "公共查詢列表数据")
public @ResponseBody Object commonData(String code) {
//根据上面定义好的map 值去和前台传的code对应
CommonDataStrategy com=new CommonDataStrategy();
Object objList=com.show(CommonVO.getStrategyMap().get(code));
return ResultVO.getSuccess("查询成功",objList);
}
最后只要前端调用的时候传入不同的菜单Code即可 调用不同的逻辑实现效果
A 系统
GET https://localhost:8444/xxxx/commonData?code=AJ
B 系统
GET https://localhost:8444/xxxx/commonData?code=BJ
补充 CommonGzpData 类:
public interface CommonGzpData {
Object resultCommonData(Long siteId, String code, String url, String parentType);
}