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