有这么一个场景,不同的电商渲染他们商品信息时,都是管理员登录,查询数据库,然后组装成特定的数据结构返回
现在这几家电商都找到同一家公司帮忙编写这样一个程序。请问如果是你,你会如何设计呢?
很明显,这里使用模板方法模式再合适不过
我们将上述 登录、查询、组装、渲染四个行为封装到一个接口中
public interface NetMall {
boolean login(String userName,String passWord);
Map queryShopInfo(String shopId);
CommonResult createInfo(Map shopId);
CommonResult getShopDetail(String shopId,String userName,String pwd);
}
抽象类使用模板方法
我们都知道这个需要渲染结果,要经过登录、查询、组装。最终都会返回一个渲染结果,所以我们用抽象类实现getShopDetail,其他逻辑交由不同的电商自行实现
public abstract class AbstractNetMall implements NetMall {
@Override
public CommonResult getShopDetail(String shopId,String userName,String pwd){
if (!login(userName,pwd)){
return new CommonResult<>(500,"登录失败",new JSonObject());
}
Map queryShopDetail = queryShopInfo(shopId);
CommonResult info = createInfo(queryShopDetail);
return info;
}
}
具体电商实现具体逻辑
public class TbMall extends AbstractNetMall {
@Override
public boolean login(String userName, String passWord) {
if (!"root".equals(userName) || !"123456".equals(passWord)) {
return false;
}
return true;
}
@Override
public Map queryShopInfo(String shopId) {
Map resultMap = new HashMap<>();
if ("0000".equals(shopId)) {
resultMap.put("id", 001);
resultMap.put("shopName", "椰树汁");
resultMap.put("price", 15L);
} else {
resultMap.put("id", 002);
resultMap.put("shopName", "其他商品");
resultMap.put("price", 100L);
}
return resultMap;
}
@Override
public CommonResult createInfo(Map map) {
String jsonStr = JSON.toJSonString(map);
return new CommonResult<>(200, "生成商品信息成功", JSON.parseObject(jsonStr));
}
}
类图
测试
@Slf4j
public class Main {
public static void main(String[] args) {
NetMall mall=new TbMall();
CommonResult shopDetail = mall.getShopDetail("001", "root", "123456");
log.info("查询结果"+shopDetail);
}
}
参考文献
重学 Java 设计模式:实战模版模式「模拟爬虫各类电商商品,生成营销推广海报场景」



