mẫu Decorator
tôi sẽ thực sự khuyên bạn nên gói ArrayList
sử dụng cũng như các tài liệu Decorator mẫu. Bạn chỉ cần quấn bạn ArrayList
với nhau thực hiện List
rằng các đại biểu hầu hết các phương pháp nhưng thêm logic xác nhận:
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
}
Ưu điểm:
- Bạn vẫn có thể truy cập danh sách nguyên liệu mà không cần xác nhận nếu bạn muốn (nhưng bạn có thể hạn chế điều này)
- Dễ dàng hơn để ngăn xếp các xác thực khác nhau, bật và tắt chúng một cách có chọn lọc.
- Khuyến khích composition over inheritance như ghi nhận của @helios
- Cải thiện testability
- Không buộc bạn đến một
List
thực hiện cụ thể, bạn có thể thêm xác nhận để LinkedList
hoặc Hibernate -backed danh sách dai dẳng. Bạn thậm chí có thể nghĩ về trang trí chung của Collection
để xác thực bất kỳ bộ sưu tập nào.
Thực hiện ghi nhận
Mặc dù việc thực hiện nhớ có khá nhiều phương pháp bạn phải nhớ về trong khi trọng: (?) add()
, addAll()
, set()
, subList()
vv
Ngoài ra bạn đối tượng phải không thay đổi, nếu không người dùng có thể thêm/đặt đối tượng hợp lệ và sửa đổi nó sau đó để vi phạm hợp đồng.
thiết kế OO Tốt
cuối cùng tôi đã viết:
validate(element)
nhưng xem xét:
element.validate()
mà là một thiết kế tốt hơn.
kiểm chứng thực Stacking
Như đã đề cập trước nếu bạn muốn ngăn xếp kiểm chứng thực, xác nhận mỗi proprty/apsect trong một duy nhất, lớp riêng biệt, xem xét các thành ngữ sau:
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);
}
... và vài hiện thực :
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
}
}
Muốn chỉ xác nhận foo?
List<MyBusinessObject> list = new FooValidatingDecorator(rawArrayList);
Bạn muốn xác nhận cả hai foo và thanh?
List<MyBusinessObject> list =
new BarValidatingDecorator(new FooValidatingDecorator(rawArrayList));
+1 cho thành phần thừa kế! – helios
+1 Cảm ơn bạn đã trả lời chi tiết – Sudhakar