正如许多示例(例如,pattern#Java)中所描述的那样,抽象装饰类只需转发组件方法。
但是在我的例子中,我需要重写一个仅在抽象类中的方法(对于类型转换):
组件
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);
}
这是正确的装饰模式实现吗?
发布于 2014-02-26 11:07:02
您的代码看起来像是想要简单地重用一个抽象方法实现,然后应用一些转换--如果使用第三方代码,我会批准这种方法,但在这种情况下,您可以控制类层次结构,因此我将在抽象基类中提取公共行为(您的ConcretePagerRepository
和PagerRepositoryConvertionDecorator
将各自扩展)。此外,覆盖已经重写的抽象方法并不是特别好的编码风格,因为您正在秘密地继承代码。为继承而设计的方法应该是抽象的或空的,或者,如果不打算继承,则应该是final
。
https://stackoverflow.com/questions/22039199
复制相似问题