背景ストーリー
インタフェース、抽象クラス、より基本的な状態では、これらの基本的なJAVAよりも、無味、プライマリ、セカンダリ包囲ライオンの数の目には、二つの他の人々へのインターフェイスを削除するには、実際にいくつかを使用する2年間の仕事に行きませんでした。
中国でのアジャイルモデルでは、常に製品の蒸し煮、蒸しデザインを叫んで、変化するニーズに対処するために苦労して技術スタッフの基礎となる、大きなを促進します。同時に、高響きの理由を見つけるために彼らの完全なパッチコードのための混沌としたこと-需要は最適化時にどのように変更されました!
、私は偉大な書き込みを感じ、とき再構築された私は、何が再建であることをどこかで再構成を実感しました:「既存のコードのデザインを改善リファクタリング」は、Martin Fowler氏による本をお勧めします。(これは、これらの工場のモデルとポイントの横に思わボールの関係を持っています?)
戻るこの場合、私たちのニーズに合わせて、例えばこのサービスオーダーステータスの変更に関しては、順序がまったく事実を状態となり、それらの異なるビジネスニーズを持って、彼らは、いくつかの共通のロジックを共有
例えば(仮定の場合、それコンテストを行います):
- ご注文のキャンセル:ステータスの変更、ログ、ブロックされたストック・リリース、メッセージ通知
- 受注に成功支払:ステータスの変更、ログ、ブロックされた株式控除、メッセージ通知
- 注文配達:状態の変更、ログ、メッセージ通知
- 状態の変更、ログ、メッセージ通知、ユーザーのポイントを増やし、資金の移動:でチェック
コードの実装
まず、注文状況の変更のためのインタフェースを作成
package com.zhibo.test.service;
public interface OrderStatusService {
/**
* 状态变更业务
* @param orderId 这个参数正常业务肯定是传一个对象了
*/
void orderStatusChange(String orderId);
/**
* 实例所支持的状态类型
* @return
*/
String getType();
}
パブリックビジネスプロセスを実装するか、調整するために使用される抽象クラスを作成します。
共通ロジックコード部分を達成しながら、メインラインは、全体のビジネス・プロセスを定義するために使用されます
package com.zhibo.test.service.impl;
import com.zhibo.test.service.OrderStatusService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
@Service
public abstract class AbstractOrderStatusService implements OrderStatusService {
protected static Logger log = LoggerFactory.getLogger(AbstractOrderStatusService.class);
@Override
public void orderStatusChange(String orderId) {
verify(orderId);
Object obj = new Object();
buildOrder(obj);
// 公共业务 如组装数据修改订单表参数,插入订单状态变更轨迹...
try {
sendMessage(getMessage(null));
} catch (Exception e) {
log.error("update loan status push error: ", e);
}
}
// 用于不同的业务流程可能有特定的数据需要组装
protected void buildOrder(Object obj){}
// 业务前的校验
protected void verify(String orderId){}
protected void sendMessage(Object obj) throws Exception{
if (obj !=null){
// ....调用接口发送消息
}
}
// 根据业务自行组装消息对象
protected abstract Object getMessage(Object dto);
}
の異なるタイプのインスタンスを作成します。
各インスタンスは、唯一の違いを補うために、プロセスに焦点を当てる必要があります
package com.zhibo.test.service.impl;
import org.springframework.stereotype.Service;
@Service
public class OrderStatusCanceledServiceImpl extends AbstractOrderStatusService{
@Override
public String getType() {
return "canceled";
}
@Override
protected void buildOrder(Object obj) {
}
@Override
protected void verify(String orderId) {
log.info("订单取消相关数据校验");
}
@Override
protected Object getMessage(Object dto) {
return null;
}
}
package com.zhibo.test.service.impl;
import org.springframework.stereotype.Service;
@Service
public class OrderStatusCloseServiceImpl extends AbstractOrderStatusService{
@Override
public String getType() {
return "close";
}
@Override
protected void buildOrder(Object obj) {
super.buildOrder(obj);
}
@Override
protected void verify(String orderId) {
log.info("订单关闭相关数据校验");
}
@Override
protected Object getMessage(Object dto) {
return null;
}
}
package com.zhibo.test.service.impl;
import org.springframework.stereotype.Service;
@Service
public class OrderStatusTimeoutServiceImpl extends AbstractOrderStatusService{
@Override
public String getType() {
return "timeout";
}
@Override
protected void buildOrder(Object obj) {
super.buildOrder(obj);
}
@Override
protected void verify(String orderId) {
log.info("订单超时相关数据校验");
}
@Override
protected Object getMessage(Object dto) {
return null;
}
}
ファクトリメソッドを作成します。
package com.zhibo.test.method;
import com.zhibo.test.service.OrderStatusService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Component
public class OrderStateMethodConfiguration {
private Map<String, OrderStatusService> orderStatusServiceHashMap = new HashMap<>();
@Autowired
private List<OrderStatusService> orderStatusServices;
@PostConstruct
public void init() {
orderStatusServices.forEach(orderStatusService ->
orderStatusServiceHashMap.put(orderStatusService.getType(),orderStatusService));
}
public OrderStatusService getLoanStatusService(String orderState){
return orderStatusServiceHashMap.get(orderState);
}
}
事業のメソッドを呼び出します
package com.zhibo.test.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class TestService {
@Autowired
private OrderStateMethodConfiguration orderStateMethodConfiguration;
public void test(){
orderStateMethodConfiguration.getLoanStatusService("timeout").orderStatusChange("123456");
}
}
出力は、
抽象クラスを使用するように簡単なようであるあなたのコードが実際の状況に応じてビジネスを理解し、優れた拡張性を持っていることが容易になるようにする工場、方法で裁判官が力を区別する場合と言うこと、あなたの多くのより良いを組み合わせグリッド。
拡張の場合:例えば、マイクロチャンネルスキャンコードのログイン、パラメータに似ログインSMS電話番号、アカウントのパスワード、ログイン第三者、いくつかの違いがあるでしょうチェックを行う必要はなく、異なるログイン検証データという、この時間に較正パラメータは、インタフェースを定義し、次にすべてのインスタンスは、ログの対応するタイプ、バリのサービスサイクルに工場設定復帰に従ってコレクションに次に一つのパリティ、パリティの種類とを実行することを実現します。
以下のコードの図の一部