如许多示例所述(例如http://en.wikipedia.org/wiki/Decorator_pattern#Java),抽象的Decorator类只需要转发组件方法。
但在我的情况下,我需要覆盖抽象类中的方法(对于类型转换):
组件
public interface PagerRepository<T> {
List<T> getPageEntries();
}
具体组件
public abstract class ConcretePagerRepository<T> implements PagerRepository<T> {
// @Override ...
}
抽象装饰
public abstract class PagerRepositoryConvertionDecorator<T, S>
implements PagerRepository<S> {
protected PagerRepository<T> repo;
public PagerRepositoryConvertionDecorator(PagerRepository<T> repo) {
this.repo = repo;
}
@Override
public List<S> getPageEntries() {
List<T> entities = this.repo.getPageEntries();
List<S> dtos = new ArrayList<S>();
for (T e : entities) {
dtos.add(convert(e));
}
return dtos;
}
protected abstract S convert(T entity);
}
这是一个正确的装饰模式实现吗?
答案 0 :(得分:0)
您的代码看起来只是想重用一个抽象方法实现并在之后应用一些转换 - 如果使用第三方代码,我会批准这种方法,但在这种情况下,您可以控制类层次结构,所以我会提取每个将扩展的ConcretePagerRepository
和PagerRepositoryConvertionDecorator
的抽象基类中的常见行为。此外,覆盖已经被覆盖的抽象方法并不是特别好的编码风格,因为你是秘密继承代码。为继承而设计的方法应该是抽象的或空的,或者,如果不打算继承,则final
。