设计模式将一系列有共性的功能代码抽离出来,使代码变得优雅和高扩展;
应用场景: 多地区菜单差异化,多地区价格计算等等
直接上代码吧!!!
1.输入参数对象定义
父类:
import lombok.Data;
import lombok.experimental.SuperBuilder;
@SuperBuilder
@Data
public class MenuParam {
private String regionCode;
}
中国地区子类:
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.SuperBuilder;
@SuperBuilder
@EqualsAndHashCode(callSuper = true)
@Data
public class ChinaMenuParam extends MenuParam {
}
日本地区子类:
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.SuperBuilder;
@SuperBuilder
@Data
@EqualsAndHashCode(callSuper = true)
public class JapanMenuParam extends MenuParam {
}
2.输出参数定义
父类:
import lombok.Data;
import lombok.experimental.SuperBuilder;
@SuperBuilder
@Data
public class MenuResult {
}
中国地区子类
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.SuperBuilder;
@Data
@SuperBuilder
@EqualsAndHashCode(callSuper = true)
public class ChinaMenuResult extends MenuResult {
private String message;
}
日本地区子类
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.SuperBuilder;
@Data
@SuperBuilder
@EqualsAndHashCode(callSuper = true)
public class JapanMenuResult extends MenuResult{
private String message;
}
3.接口定义
public interface MenuService<P1 extends MenuParam, R1 extends MenuResult> {
String getRegionCode();
R1 getMenu(P1 p);
P1 createParamObject();
/**
* 模板构建菜单
*
* @param p
* @return
*/
default R1 buildMenu(P1 p) {
return getMenu(p);
}
}
中国地区接口实现
import org.springframework.stereotype.Service;
@Service
public class ChinaMenuService implements MenuService<ChinaMenuParam, ChinaMenuResult> {
@Override
public String getRegionCode() {
return "CN";
}
@Override
public ChinaMenuResult getMenu(ChinaMenuParam p) {
return ChinaMenuResult.builder().message("中国地区菜单").build();
}
@Override
public ChinaMenuParam createParamObject() {
return ChinaMenuParam.builder().build();
}
}
日本地区接口实现
import org.springframework.stereotype.Service;
@Service
public class JapanMenuService implements MenuService<JapanMenuParam, JapanMenuResult> {
@Override
public String getRegionCode() {
return "JP";
}
@Override
public JapanMenuResult getMenu(JapanMenuParam p) {
return JapanMenuResult.builder().message("日本地区菜单").build();
}
@Override
public JapanMenuParam createParamObject() {
return JapanMenuParam.builder().build();
}
}
4.调用controller
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController(value = "RegionCodeMenuController")
public class MenuController {
private final Map<String, MenuService> menuServiceMap;
public MenuController(List<MenuService> menuServiceList) {
this.menuServiceMap = menmenuServiceList.stream().stream()
.collect(Collectors.toMap(MenuService::getRegionCode(), Function.identity()));
}
@GetMapping("/menu/{regionCode}")
public MenuResult getMenu(@PathVariable String regionCode) {
MenuService menuService = menuServiceMap.get(regionCode);
MenuParam param = menuService.createParamObject();
param.setRegionCode(regionCode);
return menuService.buildMenu(param);
}
}