代码太长怎么办?试试命令模式(下)

简介: 代码太长怎么办?试试命令模式(下)

命令实现


实物商品实现类:


/**
 * 实物订单处理
 */
public class InKindOrderDetailCommand implements OrderDetailService {
    @Override
    public Map<String, List<OrderDetailDto>> orderDetailProcess(List<OrderDetailDto> orderDetailList) {
        // 订单中的实物
        List<OrderDetailDto> resultList = orderDetailList.stream()
                // 筛选出实物
                .filter(item -> Objects.equals(1, item.getCommodityType()))
                .peek(item -> {
                    // 计算原价
                    item.setOriginalPrice(item.getCommodityUnitPrice().multiply(new BigDecimal(item.getCommodityQuantity())));
                    // 计算其他数据项目 ....
                }).collect(toList());
        return new HashMap<String, List<OrderDetailDto>>() {
            {
                put("inKind", resultList);
            }
        };
    }
}


虚拟商品实现类:


public class VirtualItemOrderDetailCommand implements OrderDetailService {
    @Override
    public Map<String, List<OrderDetailDto>> orderDetailProcess(List<OrderDetailDto> orderDetailList) {
        return null;
    }
}


其他商品实现类:


/**
 * 其他物品
 */
public class OtherOrderDetailCommand implements OrderDetailService {
    @Override
    public Map<String, List<OrderDetailDto>> orderDetailProcess(List<OrderDetailDto> orderDetailList) {
        return null;
    }
}


命令调用


调用工具类(Terminial 类)


public class OrderDetailServices {
    public List<OrderDetailService> orderDetailServiceList = new ArrayList<>();
    /**
     * 初始化方法
     */
    public static OrderDetailServices create() {
        OrderDetailServices orderDetailServices = new OrderDetailServices();
        // 实物
        OrderDetailService inKindOrderDetail = new InKindOrderDetailCommand();
        // 虚拟物品
        OrderDetailService virtualItemOrderDetail = new VirtualItemOrderDetailCommand();
        // 赠送物品(优惠券、积分)
        OrderDetailService giveAwayOrderDetail = new GiveAwayOrderDetailCommand();
        // 其他
        OrderDetailService otherOrderDetail = new OtherOrderDetailCommand();
        orderDetailServices.orderDetailServiceList =
                Arrays.asList(inKindOrderDetail, virtualItemOrderDetail, giveAwayOrderDetail, otherOrderDetail);
        return orderDetailServices;
    }
    public Map<String, List<OrderDetailDto>> orderDetailProcess(List<OrderDetailDto> orderDetailList) {
        Map<String, List<OrderDetailDto>> resultMap = new HashMap<>();
        for (OrderDetailService item : orderDetailServiceList) {
            Map<String, List<OrderDetailDto>> tmpMap = item.orderDetailProcess(orderDetailList);
            if (tmpMap != null && !tmpMap.isEmpty()) {
                resultMap.putAll(tmpMap);
            }
        }
        return resultMap;
    }
}


测试类:


public class OrderDetailServiceTest {
    public static void main(String[] args) {
        OrderDetailServices detailServices = OrderDetailServices.create();
        OrderDetailDto orderDetailDto = new OrderDetailDto();
        orderDetailDto.setOrderCode("CD00001");
        orderDetailDto.setCommodityType(1);
        orderDetailDto.setCommodityName("GTX 3080 TI");
        orderDetailDto.setCommodityUnitPrice(new BigDecimal("8999"));
        orderDetailDto.setCommodityQuantity(2);
        OrderDetailDto orderDetailDto2 = new OrderDetailDto();
        orderDetailDto2.setCommodityType(1);
        orderDetailDto2.setOrderCode("CD00002");
        orderDetailDto2.setCommodityName("LEI SHEN 茶轴 1088");
        orderDetailDto2.setCommodityUnitPrice(new BigDecimal("488"));
        orderDetailDto2.setCommodityQuantity(1);
        OrderDetailDto orderDetailDto3 = new OrderDetailDto();
        orderDetailDto3.setCommodityType(2);
        orderDetailDto3.setOrderCode("CJ00002");
        orderDetailDto3.setCommodityName("满 5000 减 200");
        orderDetailDto3.setCommodityUnitPrice(new BigDecimal("200"));
        orderDetailDto3.setCommodityQuantity(2);
        OrderDetailDto orderDetailDto4 = new OrderDetailDto();
        orderDetailDto4.setCommodityType(2);
        orderDetailDto4.setOrderCode("CJ00002");
        orderDetailDto4.setCommodityName("满 5000 减 100");
        orderDetailDto4.setCommodityUnitPrice(new BigDecimal("100"));
        orderDetailDto4.setCommodityQuantity(1);
        List<OrderDetailDto> detailList = Arrays.asList(
                orderDetailDto,
                orderDetailDto2,
                orderDetailDto3,
                orderDetailDto4);
        Map<String, List<OrderDetailDto>> resultMap = detailServices
                .orderDetailProcess(detailList);
        System.out.println(resultMap);
    }
}


总结


命令模式非常适合于数据的处理,支持撤销、重做。将命令处理对象以参数的形式进行传递,最后对数据进行一个统一的处理。它的优缺点如下:


优点:降低耦合度、非常容易拓展、比如上面我在增加一个详情分类非常容易。


缺点:如果当命令非常多的情况下,可能会导致项目的 “类爆炸”。


参考


m.runoob.com/design-patt…


相关文章
奇怪的“可以复制 不能粘贴”问题
奇怪的“可以复制 不能粘贴”问题
|
4月前
|
前端开发 C语言
C语言08----注释扩展知识点,注释快捷键:ctrl+k,ctrl + C,取消快捷键 ctrl + K,ctrl + U
C语言08----注释扩展知识点,注释快捷键:ctrl+k,ctrl + C,取消快捷键 ctrl + K,ctrl + U
|
6月前
|
Shell 定位技术 开发工具
[oeasy]python0015_键盘改造_将esc和capslock对调_hjkl_移动_双手正位
[oeasy] python0015_键盘改造_将 esc 和 capslock 对调_hjkl_移动_双手正位
53 3
|
6月前
|
开发工具
vim命令编辑完文件后,按ESC键退出编辑模式,无法进入命令模式解决方案
vim命令编辑完文件后,按ESC键退出编辑模式,无法进入命令模式解决方案
668 0
|
6月前
|
Linux 开发工具 C语言
Vi编辑器的基本使用
Vi编辑器是最常用的Linux系统文本编辑工具,可以帮助我们通过一系列命令对文本文件进行编辑操作,具有命令行模式、插入模式、底行模式这三种工作模式,通常我们通过Vi编辑器对一个文件进行操作,需要在这三种模式之间来回切换。本文将列举各模式操作方法并带领大家一起用Vim编辑器写出第一个HelloWorld程序。
106 0
|
设计模式 存储 调度
2023-7-10-第十五式命令模式
2023-7-10-第十五式命令模式
80 0
|
Kubernetes Docker 容器
关于Esc服务器的一些用法
相信大多数人都是拿来用作部署个人作品的,关于我遇到的一些问题可以借鉴给你们
122 1
|
存储 数据处理 流计算
代码太长怎么办?试试命令模式(上)
代码太长怎么办?试试命令模式(上)
236 0
代码太长怎么办?试试命令模式(上)
|
Java Go 开发工具