序文
私のブログ(前ロマンチックとして花の数)は、2つのデザインパターン関連コンテンツを更新しました
- 戦闘モードでの戦略デザインパターンを[学習]:送信されたポリシーベースの戦闘モードメッセージを
- [学習]デザインパターンの戦闘モードIIとの戦略:他にあれば、アノテーションビジネスコードの冗長性を持つキル...
- ビジターパターンデザインパターンの戦闘で[学習]:木の剪定権管理ポイントの操作
- [共同]モード+ +テンプレートメソッドファクトリメソッドの戦闘学習コマンド・デザイン・パターン:どのようにエレガントな更新製品在庫を...
上記(合理化に基づいて、実際のビジネスシナリオに設計されているシーンに実際の使用の仕事を)。
前の研究のデザインパターンにするために、例えば、いくつかの無関係なデモを主に塗装UMLのクラス図を説明するためのオンライン関連のブログをたくさん見て、何回か読んではまだ霧です。
彼らはプロジェクトをやっているのでので、ここでは、デザインパターンの多数のプロジェクトで使用され、流線実世界のビジネスシナリオB2Cモールの一部であり、コアビジネスのコードが引き出されました。コードは、コードが使用のみに学習交換として使用され、すべての機密情報は、シールドされた、すべての企業情報を必要としません。
ビジネスシーン
フロー図は、我々は最初のシーンの抽象一部に注文を送信するために見て:
注文センター:
1、注文センター順序作成
2を、転送順序ステータス(状態モデル)
3、操作ログ記録(+デコレータ単純なファクトリパターン)
4、中心線在庫更新通知ストックセンター
ディスパッチセンター:
1、センターでは、(コマンドモード+ +テンプレートメソッドパターン・ファクトリーモードを使用して)ローカルの在庫目録を更新
:この意味は述べている[まとめ]コマンドデザインパターンは、モード+ +テンプレートメソッドファクトリメソッドの戦闘を学ぶ:エレガントなタイトルを更新する方法インベントリ...
2、メッセージ、メッセージのディスパッチ・センタ消費(中間モード)に更新されたインベントリデータ
メッセージキューに3、キューがオフラインストレージ(メモモード)のために必要で満たされている場合、充填されたか否かを判断します
図4に示すように、非同期メッセージ処理結果モニタ(オブザーバーパターン)
このモデルは、我々はステップバイステップで、非常に単純である必要があり、ステップバイステップでは、コード分析を解体します
注文状況転送操作履歴レコード+
コードの実装
注文受注センター業務を提出
/** * 订单状态管理器 */ @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; }
オーダーステータスマネージャ
/** * 会自动记录日志的订单状态管理器 * @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)); } }
植物のログ操作
/** * 订单操作内容工厂 * @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; } }
注文状況の循環
状態がで行くとき、現在の状態が次の状態に移すことができるかどうかを判断するので、私たちは唯一、順番を一覧表示され、二つの状態を作成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; // 这里还会有更多的订单状态:支付、确认收货、发货、退货等等状态流转 }
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は、ソースを明記してください転載必要があります!
興味のパートナーは、個々の国民の少数心配することができる:一つの枝にはロマンチックな花を数えます