[共同]状態の学校のデザインモードモードモード+ +装飾シンプルな工場のパターンは、実際:()私はどのような地獄を経て、最終的に注文を提出しますか?

序文

私のブログ(前ロマンチックとして花の数)は、2つのデザインパターン関連コンテンツを更新しました

上記(合理化に基づいて、実際のビジネスシナリオに設計されているシーンに実際の使用の仕事を)。

前の研究のデザインパターンにするために、例えば、いくつかの無関係なデモを主に塗装UMLのクラス図を説明するためのオンライン関連のブログをたくさん見て、何回か読んではまだ霧です。

彼らはプロジェクトをやっているのでので、ここでは、デザインパターンの多数のプロジェクトで使用され、流線実世界のビジネスシナリオB2Cモールの一部であり、コアビジネスのコードが引き出されました。コードは、コードが使用のみに学習交換として使用され、すべての機密情報は、シールドされた、すべての企業情報を必要としません。

ビジネスシーン

フロー図は、我々は最初のシーンの抽象一部に注文を送信するために見て:

17C4F70C-E159-4AD8-B394-232A54F52F01.png

注文センター:
1、注文センター順序作成
2を、転送順序ステータス(状態モデル)
3、操作ログ記録(+デコレータ単純なファクトリパターン)
4、中心線在庫更新通知ストックセンター

ディスパッチセンター:
1、センターでは、(コマンドモード+ +テンプレートメソッドパターン・ファクトリーモードを使用して)ローカルの在庫目録を更新
:この意味は述べている[まとめ]コマンドデザインパターンは、モード+ +テンプレートメソッドファクトリメソッドの戦闘を学ぶ:エレガントなタイトルを更新する方法インベントリ...
2、メッセージ、メッセージのディスパッチ・センタ消費(中間モード)に更新されたインベントリデータ
メッセージキューに3、キューがオフラインストレージ(メモモード)のために必要で満たされている場合、充填されたか否かを判断します
図4に示すように、非同期メッセージ処理結果モニタ(オブザーバーパターン)

このモデルは、我々はステップバイステップで、非常に単純である必要があり、ステップバイステップでは、コード分析を解体します

注文状況転送操作履歴レコード+

コードの実装

  1. 注文受注センター業務を提出

    /**
    * 订单状态管理器
    */
    @Autowired
    private LoggedOrderStateManager orderStateManager;
    
    public OrderInfoDTO save(OrderInfoDTO order) throws Exception {
        // 检查库存是否充足
        if(!isStockEnough(order)) {
            return order;
        }
    
        // 将订单信息保存到本地数据库
        saveOrder(order);
        // 订单状态流转
        orderStateManager.create(order); 
    
        // other logic
        return order;
    }
  2. オーダーステータスマネージャ

    /**
     * 会自动记录日志的订单状态管理器
     * @author wangmeng
     *
     */
    @Component
    public class LoggedOrderStateManager implements OrderStateManager {
    
        /**
         * 订单状态管理器
         */
        @Autowired
        private OrderStateManagerImpl orderStateManager;
    
        /**
         * 订单操作日志DAO组件
         */
        @Autowired
        private OrderOperateLogDAO orderOperateLogDAO;
    
        /**
         * 订单操作内容工厂
         */
        @Autowired
        private OrderOperateLogFactory orderOperateLogFactory;
    
        @Override
        public void create(OrderInfoDTO order) throws Exception {
            orderStateManager.create(order); 
            orderOperateLogDAO.save(orderOperateLogFactory.get(order, OrderOperateType.CREATE_ORDER));      
        }
    
        @Override
        public Boolean canCancel(OrderInfoDTO order) throws Exception {
            return orderStateManager.canCancel(order);
        }
    
        @Override
        public void cancel(OrderInfoDTO order) throws Exception {
            orderStateManager.cancel(order); 
            orderOperateLogDAO.save(orderOperateLogFactory.get(order, OrderOperateType.CANCEL_ORDER)); 
        }
    }
  3. 植物のログ操作

    /**
     * 订单操作内容工厂
     * @author wangmeng
     *
     */
    @Component
    public class OrderOperateLogFactory {
    
        /**
         * 日期辅助组件
         */
        @Autowired
        private DateProvider dateProvider;
    
        /**
         * 获取订单操作内容
         * @param operateType 订单操作类型
         * @return 订单操作内容
         */
        public OrderOperateLogDO get(OrderInfoDTO order, Integer operateType) throws Exception {
            String operateContent = null;
    
            if(OrderOperateType.CREATE_ORDER.equals(operateType)) {
                operateContent = "完成订单创建,订单编号为:" + order.getOrderNo(); 
            } else if(OrderOperateType.CANCEL_ORDER.equals(operateType)) {
                operateContent = "取消订单,订单编号为:" + order.getOrderNo();
            } else if(OrderOperateType.PAY_ORDER.equals(operateType)) {
                operateContent = "支付订单,订单编号为:" + order.getOrderNo() + ",支付金额为:" + order.getPayableAmount();
            } else if(OrderOperateType.GOODS_DELIVERY.equals(operateType)) {
                operateContent = "已经将订单中的商品进行发货"; 
            } else if(OrderOperateType.CONFIRM_RECEIPT.equals(operateType)) {
                operateContent = "完成确认收货"; 
            } else if(OrderOperateType.APPLY_RETURN_GOODS.equals(operateType)) {
                operateContent = "申请退货"; 
            } else if(OrderOperateType.RETURN_GOODS_REJECTED.equals(operateType)) {
                operateContent = "退货申请审核不通过"; 
            } else if(OrderOperateType.RETURN_GOODS_APPROVED.equals(operateType)) {
                operateContent = "退货申请审核已通过"; 
            } else if(OrderOperateType.SEND_OUT_RETURN_GOODS.equals(operateType)) {
                operateContent = "寄送退货商品"; 
            } else if(OrderOperateType.CONFIRM_RETURN_GOODS_RECEIPT.equals(operateType)) {
                operateContent = "确认收到退货商品"; 
            } else if(OrderOperateType.FINISHED_RETURN_GOODS_INPUT.equals(operateType)) {
                operateContent = "完成退货商品入库"; 
            } else if(OrderOperateType.FINISHED_RETURN_GOODS_REFUND.equals(operateType)) {
                operateContent = "完成退款"; 
            }     
    
            OrderOperateLogDO log = create(order, operateType, operateContent);
            return log;
        }
    
        /**
         * 创建订单操作日志
         * @param operateType 订单操作类型
         * @param operateContent 订单操作内容
         * @return 订单操作日志
         * @throws Exception
         */
        private OrderOperateLogDO create(OrderInfoDTO order ,
                Integer operateType, String operateContent) throws Exception {
            OrderOperateLogDO log = new OrderOperateLogDO();
    
            log.setOrderInfoId(order.getId()); 
            log.setOperateType(operateType);
            log.setOperateContent(operateContent); 
            log.setGmtCreate(new Date());
            log.setGmtModified(new Date()); 
            return log;
        }
    
    }
  4. 注文状況の循環
    状態がで行くとき、現在の状態が次の状態に移すことができるかどうかを判断するので、私たちは唯一、順番を一覧表示され、二つの状態を作成cacel、そうcanCancel方法があります。

    /**
     * 订单状态管理器接口
     * @author wangmeng
     *
     */
    interface OrderStateManager {
    
        /**
         * 创建订单
         * @param order 订单
         * @throws Exception
         */
        void create(OrderInfoDTO order) throws Exception;
    
        /**
         * 订单能否执行取消操作
         * @param order 订单
         * @return 能否执行取消操作
         * @throws Exception
         */
        Boolean canCancel(OrderInfoDTO order) throws Exception;
    
        /**
         * 执行取消订单操作
         * @param order 订单
         * @throws Exception
         */
        void cancel(OrderInfoDTO order) throws Exception;
    
        // 这里还会有更多的订单状态:支付、确认收货、发货、退货等等状态流转
    }
  5. OrderStateManager実装クラス

    /**
     * 订单状态管理器
     * @author wangmeng
     *
     */
    @Component
    public class OrderStateManagerImpl implements OrderStateManager {
    
        /**
         * 已取消状态
         */
        @Autowired
        private CanceledOrderState canceledOrderState;
    
        /**
         * 待付款状态
         */
        @Autowired
        private WaitForPayOrderState waitForPayOrderState;
    
        /**
         * 创建订单
         * @param order 订单
         * @throws Exception
         */
        @Override
        public void create(OrderInfoDTO order) throws Exception {
            waitForPayOrderState.doTransition(order);
        }
    
        /**
         * 订单能否执行取消操作
         * @param order 订单
         * @return 能否执行取消操作
         * @throws Exception
         */
        @Override
        public Boolean canCancel(OrderInfoDTO order) throws Exception {
            return getOrderState(order).canCancel(order);
        }
    
        /**
         * 执行取消订单操作
         * @param order 订单
         * @throws Exception
         */
        @Override
        public void cancel(OrderInfoDTO order) throws Exception {
            canceledOrderState.doTransition(order); 
        }
    
        /**
         * 获取订单状态组件
         * @param order 订单
         * @return 订单状态组件
         * @throws Exception
         */
        private OrderState getOrderState(OrderInfoDTO order) throws Exception {
            if(OrderStatus.WAIT_FOR_PAY.equals(order.getOrderStatus())) {
                return waitForPayOrderState;
            } else if(OrderStatus.CANCELED.equals(order.getOrderStatus())) {
                return canceledOrderState;
            } else if(OrderStatus.WAIT_FOR_DELIVERY.equals(order.getOrderStatus())) {
                return waitForDeliveryOrderState;
            } else if(OrderStatus.WAIT_FOR_RECEIVE.equals(order.getOrderStatus())) {
                return waitForReceiveOrderState;
            } else if(OrderStatus.FINISHED.equals(order.getOrderStatus())) {
                return finishedOrderState;
            } else if(OrderStatus.WAIT_FOR_RETURN_GOODS_APPROVE.equals(order.getOrderStatus())) {
                return waitForReturnGoodsApproveOrderState;
            }
            return defaultOrderState;
        }
    }

    OrderStateの:

    /**
     * 订单状态
     * @author wangmeng
     *
     */
    public interface OrderState {
    
        /**
         * 订单流转到当前这个状态
         * @param order 订单
         * @throws Exception
         */
        void doTransition(OrderInfoDTO order) throws Exception;
    
        /**
         * 判断当前状态下能否执行取消订单操作
         * @param order 订单
         * @return 能否执行取消订单操作
         * @throws Exception
         */
        Boolean canCancel(OrderInfoDTO order) throws Exception;
    }

    WaitForPayOrderState:

    /**
     * 待付款状态
     * @author wangmeng
     *
     */
    @Component
    public class WaitForPayOrderState extends AbstractOrderState {
    
        @Autowired
        public WaitForPayOrderState(DateProvider dateProvider, OrderInfoDAO orderInfoDAO) {
            super(dateProvider, orderInfoDAO);
        }
    
        @Override
        protected Integer getOrderStatus(OrderInfoDTO order) throws Exception {
            return OrderStatus.WAIT_FOR_PAY;
        }
    
        @Override
        public Boolean canPay(OrderInfoDTO order) throws Exception {
            return true;
        }
    
        @Override
        public Boolean canCancel(OrderInfoDTO order) throws Exception {
            return true;
        }
    }

    AbstractOrderState:

    
    /**
     * 订单状态的抽象基类
     * @author wangmeng
     *
     */
    public abstract class AbstractOrderState implements OrderState {
    
        /**
         * 订单管理DAO组件
         */
        protected OrderInfoDAO orderInfoDAO;
    
        public AbstractOrderState(OrderInfoDAO orderInfoDAO) {
            this.orderInfoDAO = orderInfoDAO;
        }
    
        /**
         * 订单流转到当前这个状态
         * @param order 订单
         */
        @Override
        public void doTransition(OrderInfoDTO order) throws Exception {
            Integer orderStatus = getOrderStatus(order);
            order.setOrderStatus(orderStatus);
            orderInfoDAO.updateStatus(order.getId(), orderStatus);  
        }
    
        /**
         * 获取订单状态
         * @param order 订单
         * @return 订单状态
         * @throws Exception
         */
        protected abstract Integer getOrderStatus(OrderInfoDTO order) throws Exception;
    
        /**
         * 判断当前状态下能否执行取消订单操作
         * @param order 订单
         * @return 能否执行取消订单操作
         */
        @Override
        public Boolean canCancel(OrderInfoDTO order) throws Exception {
            return false;
        }
    }

概要

上記だけで使用して注文を送信するためにセンターについて話しています状态模式简单工厂模式装饰器模式

ステータスモード:OrderStat + OrderStateManager他
の単純なファクトリパターン:OrderOperateLogFactory
デコレータ:LoggedOrderStateMananger

前記LoggedOrderStateMananger OrderStateManagerは録画機能が自動的に転送した後の状態をログに記録することができるように、インターフェース、強化解除、作成、給与とロギングの機能を追加する他の方法の実現を、実装しています。

ここではそれを提供するために合理化だけでコードされている、私が説明するために、別の記事で開きます後で提出注文の背後にあるプロセスの数、ので、しばらくお待ちがあり、真剣な表情は非常に簡単に理解することはまだあると信じています。

宣言

:私のブログから始まるこの記事https://www.cnblogs.com/wang-mengと公共番号:ロマンチックみなさ一つramiflorous BEは、ソースを明記してください転載必要があります!

興味のパートナーは、個々の国民の少数心配することができる:一つの枝にはロマンチックな花を数えます

22.jpg

おすすめ

転載: www.cnblogs.com/wang-meng/p/12038619.html
おすすめ