데코레이터 패턴
사실은 잘 문서화 Decorator 패턴을 사용하여 ArrayList
포장 추천 할 것입니다. 당신은 단순히 포장하여 위임 방법 중 가장 그러나이 유효성 검사 논리 추가 다른 List
구현 ArrayList
:
public class ValidatingListDecorator extends AbstractList<MyBusinessObject>
{
private final List<MyBusinessObject> target;
public ValidatingListDecorator(List<MyBusinessObject> target) {
this.target = target;
}
@Override
public MyBusinessObject set(int index, MyBusinessObject element)
{
validate(element);
return target.set(index, element);
}
@Override
public boolean add(MyBusinessObject o)
{
validate(o);
return target.add(o);
}
//few more to implement
}
장점 : 당신이 원하는 경우
- 당신은 아직 검증하지 않고 원료 목록에 액세스 할 수 있습니다 (하지만 당신이 할 수있는 이 제한)
- 다른 유효성 검사를 쉽게 쌓아 올리려면 선택 사항을 켜고 끕니다. @helios
- 에서 언급 한 바와 같이
- 특정
List
구현을 묶어하지 않습니다 테스트 용이성
- 을 향상 composition over inheritance 촉진, 당신은
LinkedList
에 유효성 검사를 추가하거나 Hibernate 영구 목록을 -backed. 모든 컬렉션의 유효성을 검사하기 위해 일반 Collection
데코레이터를 생각해 볼 수도 있습니다.
구현 구현에도 불구하고
을 기억 노트 당신에 대해 기억해야 할 방법을 꽤 많이 있습니다 오버라이드 (override) 동안 (?) 또한 당신의 add()
, addAll()
, set()
, subList()
을 등
객체는 변경 불가능해야합니다. 그렇지 않으면 유효한 객체를 추가/설정하고 이후에 수정하여 계약을 위반할 수 있습니다.
좋은 OO 디자인은 마침내 나는 썼다 :
validate(element)
하지만 고려 : 더 나은 디자인입니다
element.validate()
합니다.
스태킹 검증 단일, 별도의 클래스에 각하게 proprty/apsect를 검증, 검증 스택하려는 경우, 다음과 같은 관용구 고려하기 전에 언급 한 바와 같이
:
public abstract class ValidatingListDecorator extends AbstractList<MyBusinessObject>
{
private final List<MyBusinessObject> target;
public ValidatingListDecorator(List<MyBusinessObject> target) {
this.target = target;
}
@Override
public MyBusinessObject set(int index, MyBusinessObject element)
{
validate(element);
return target.set(index, element);
}
protected abstract void validate(MyBusinessObject element);
}
을 ... 그리고 몇 구현 :
class FooValidatingDecorator extends ValidatingListDecorator {
public FooValidatingDecorator(List<MyBusinessObject> target)
{
super(target);
}
@Override
protected void validate(MyBusinessObject element)
{
//throw if "foo" not met
}
}
class BarValidatingDecorator extends ValidatingListDecorator {
public BarValidatingDecorator(List<MyBusinessObject> target)
{
super(target);
}
@Override
protected void validate(MyBusinessObject element)
{
//throw if "bar" not met
}
}
만 foo는을 확인하고 싶으십니까?
List<MyBusinessObject> list = new FooValidatingDecorator(rawArrayList);
는
foo는 및
바 모두를 확인하고 싶으십니까?
List<MyBusinessObject> list =
new BarValidatingDecorator(new FooValidatingDecorator(rawArrayList));
+1 상속 이상의 구성! – helios
+1 많은 답변을 주셔서 감사합니다. – Sudhakar