java使用策略模式实现统一接口的不同效果返回

首先说下什么是策略模式以及策略模式的优缺点。

策略模式
是指定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到其他使用算法的用户;
可以避免多重的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);
}

说明:这个类就是一个接口,定义规范,而其他的几个类都会实现这个接口的规范方法。
如图:
java使用策略模式实现统一接口的不同效果返回_第1张图片

你可能感兴趣的:(设计模式,设计模式,java)