この質問は、私の以前の投稿の一種です:javaでのビジターパターンの実装-これはどのように見えますか?
コードのリファクタリング中に少し混乱しました。ビジターパターン(前の投稿で説明)を複合戦略パターンに変換しようとしています。私はこのようなことをしようとしています:
public interface Rule {
public List<ValidatonError> check(Validatable validatable);
}
ここで、次のようなルールを定義します。
public class ValidCountryRule {
public List<ValidationError> check(Validatable validatable) {
// invokeDAO and do something, if violation met
// add to a list of ValidationErrors.
// return the list.
}
}
これで、検証する2つの異なるタイプのオブジェクトを作成できます。これらの2つは完全に異なる可能性があります。あるストアがありValidatable
、次にあるストアがSchedule
あるとしValidatable
ます。さて、次のようなコンポジットを作成するとします。
class Validator implements Rule {
private List<Rule> tests = new ArrayList<Rule>();
public void addRule(Rule rule) {
tests.add(rule);
}
public List<ValidationError> check(Visitable visitable) {
List<ValidationError> list = new ArrayList<ValidationError>();
for(Rule rule : tests) {
list.addAll(rule.check(visitable);
}
}
public Validator(ValidatorType type) {
this.tests = type.getRules();
}
}
enum
どのチェックセットがどこに行くかを定義するを定義します...
public Enum ValidatorType {
public abstract List<Rule> getRules();
STORE_VALIDATOR {
public List<Rule> getRules() {
List<Rule> rules = new ArrayList<Rule>();
rules.add(new ValidCountryRule());
rules.add(new ValidXYZRule());
}
// more validators
}
そして最後に、私はそれを次のように使用します:
Validator validator = new Validator(ValidatorType.STORE_VALIDATOR);
for (Store store : stores) {
validator.check(store);
}
デザインに欠陥があるのが不思議です。Ruleインターフェースがを期待しているという考えは好きではありませんValidatable
。これをどのように改善するか提案していただけますか?
あなたの助けに感謝。