策略模式+模板模式让代码更优雅

设计模式将一系列有共性的功能代码抽离出来,使代码变得优雅和高扩展;

应用场景: 多地区菜单差异化,多地区价格计算等等

直接上代码吧!!!

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);
    }

}

QQ交流群: 132312549

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值