インタフェースマルチインプリメンテーションクラスダイナミックスイッチングインプリメンテーション

2288 ワード

背景
ビジネスシステムの開発を続けており、同じビジネス操作で複数の異なるシーンが存在する可能性があります.例えば、通勤の交通費を計算すると、歩行、ドライブ、タクシー、公共交通費が異なるに違いありません.if-elseを直接書くと、コードの可読性が悪く、拡張が難しくなり、シーンの増加と複雑さが高まるにつれて、コードのメンテナンスがさらに難しくなります.だから最も良い方法は抽象的に1つのインタフェースを出して、各シーンは単独で内部の業務ロジックを実現して、違いを単独で開きます.では、問題は、ビジネスパラメータに基づいて異なるビジネスシーンのサービス自動切り替えを実現する方法です.
インプリメンテーション
ネットサーフィンで調べてみると、基本的には参考記事に書いてある4種類があり、個人的には最後の4種類に傾いており、コードの簡潔さと拡張性が良い.現在もこのようにして、実現方式を記録します.実はちょっと面倒な感じがしますが、後で最適化して改善できるかどうか見てみましょう.
/**
 *              
 *
 * @author 8102
 * @date 2020/7/31
 */
public interface ICostService {

    /**
     *         
     */
    void register();

    /**
     *     
     * @param request     
     */
    void computer(Request request);
}
/**
 *           
 *
 * @author 8102
 * @date 2020/7/31
 */
@Slf4j
@Service
public class SelfDrivingServiceImpl implements ICostService {

    @Override
    @PostConstruct
    public void register() {
        CostComputerServiceBroker.register("SelfDriving", this);
    }

    @Override
    public void computer(Request request) {
        //   
    }
}
/**
 *        
 *
 * @author 8102
 * @date 2020/7/31
 */
@Slf4j
@Service
public class CostComputerServiceBroker {

    /**
     *     
     */
    private static Map serviceMap = new HashMap<>();

    /**
     *     
     * @param serviceKey     
     * @param service     
     */
    public static void register(String serviceKey, ICostService service) {
        CostComputerServiceBroker.serviceMap.put(serviceKey, taskApprovalService);
    }

    /**
     *     
     * @param request   
     */
    public void computerCost(Request request) {
        ICostService service = getService(request.getServiceKey());
        service.computer(taskApproveRequest);
    }

    /**
     *     
     * @param serviceKey     Key
     * @return
     */
    private ICostService getService(String serviceKey) {
        ITaskApprovalService service = taskApprovalServiceMap.get(serviceKey);
        if (Objects.isNull(service)) {
            throw new SystemException(String.format("serviceKey[%s]        ", serviceKey));
        }
        return service;
    }

}

 
リファレンス
インタフェースとクラスのダイナミック切り替えを実現する4つの方法