java是否尊重装饰模式?
正如许多示例(例如http://en.wikipedia.org/wiki/Decorator_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);
}
这是正确的装饰器模式实现吗
# 1 楼答案
你的代码看起来像是想简单地重用一个抽象方法实现,然后应用一些转换——如果使用第三方代码,我会批准这种方法,但是在本例中,您控制着类层次结构,因此我将提取抽象基类中的常见行为,您的
ConcretePagerRepository
和PagerRepositoryConvertionDecorator
都将被扩展。此外,覆盖一个已经被覆盖的抽象方法并不是特别好的编码风格,因为你在秘密地继承代码。为继承而设计的方法应该是抽象的或空的,或者,如果不打算被继承,则应该是final