이 질문은 이전 게시물의 일부입니다. Visitor pattern implementation in java- How does this look?복합 전략 패턴 - 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.
}
}
을 지금, 나는이 두 가지 유형을 가질 수 것은 검증 될 객체. 이 두 가지는 완전히 다른 것일 수 있습니다. Validatable
인 상점과 인 Schedule
이 있다고 가정 해보십시오. 나는이 같을 것이다 복합을 작성하면 이제 :
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
을 기대하고 있다는 생각을 좋아하지 않습니다. 이걸 어떻게 향상 시킬지 제안 해 주시겠습니까?
감사합니다.
들여 쓰기의 모든 규칙을 위반했습니다. 다른 사람들이보고 바라는 것을 원한다면 코드가 좀 더 잘 보이도록해야합니다.지금은 끔찍한 코드 냄새가 난다. –
@ Trevor 죄송합니다. 지금 고쳐 주셨습니다. – Jay
들여 쓰기는 여전히 다소 읽을 수 없었습니다. 나는 그것을 고쳤다. – Eddie