戦略パターンの使用中に問題が発生しました。タスクを作成するサービスを実装しています。このサービスは、このタスクの責任者も解決します。事務員の解決は、さまざまな方法があるため、戦略パターンを使用して行われます。ポイントは、クラークを解決するために、すべての戦略が異なるパラメーターを必要とする可能性があるということです。
例えば:
interface ClerkResolver {
String resolveClerk(String department);
}
class DefaultClerkResolver implements ClerkResolver {
public String resolveClerk(String department) {
// some stuff
}
}
class CountryClerkResolver implements ClerkResolver {
public String resolveClerk(String department) {
// I do not need the department name here. What I need is the country.
}
}
問題は、責任者を解決するために、すべてのリゾルバーが異なるパラメーターに依存する可能性があることです。私にとって、これは私のコードの設計上の問題のように思えます。また、次のように、戦略で必要となる可能性のあるすべての値を保持するために、クラスをパラメーターとして使用しようとしました。
class StrategyParameter {
private String department;
private String country;
public String getDepartment() ...
}
interface ClerkResolver {
String resolveClerk(StrategyParameter strategyParameter);
}
しかし、正直なところ、ストラテジーに新しい引数や別の引数が必要になるたびにパラメーター クラスを変更する必要があるため、このソリューションには満足していません。次に、戦略の呼び出し元はすべてのパラメーターを設定する必要があります。これは、どの戦略がクラークを解決するかわからないためです。したがって、すべてのパラメーターを提供する必要があります (ただし、これはそれほど悪くはありません)。
繰り返しますが、これはコードの設計上の問題のように思えますが、より良い解決策が見つかりません。
- - 編集
このソリューションの主な問題は、タスクを作成するときです。タスク サービスは次のようになります。
class TaskService {
private List<ClerkResolver> clerkResolvers;
Task createTask(StrategyParamter ...) {
// some stuff
for(ClerkResolver clerkResolver : clerkResolvers) {
String clerk = clerkResolver.resolveClerk(StrategyParameter...)
...
}
// some other stuff
}
}
TaskService が使用される場合にわかるように、TaskService 自体にはこれらの情報がないため、発信者は店員を解決するために必要な情報、つまり部門名や国を提供する必要があります。
タスクを作成する必要がある場合、呼び出し元は StrategyParameter を提供する必要があります。これは、店員を解決するために必要だからです。繰り返しますが、問題は発信者がすべての情報を持っていないことです。つまり、発信者はその国の知識を持っていません。部署名しか設定できません。そのため、2 つ目のメソッドをインターフェースに追加して、ストラテジーがクラークの解決を確実に処理できるようにしました。
interface ClerkResolver {
String resolveClerk(StrategyParameter strategyParameter);
boolean canHandle(StrategyParameter strategyParameter);
}
繰り返しますが、この解決策は私には正しく聞こえません。
したがって、誰かがこの問題のより良い解決策を持っている場合は、それを聞いていただければ幸いです.
コメントしてくれてありがとう!