有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    你的代码看起来像是想简单地重用一个抽象方法实现,然后应用一些转换——如果使用第三方代码,我会批准这种方法,但是在本例中,您控制着类层次结构,因此我将提取抽象基类中的常见行为,您的ConcretePagerRepositoryPagerRepositoryConvertionDecorator都将被扩展。此外,覆盖一个已经被覆盖的抽象方法并不是特别好的编码风格,因为你在秘密地继承代码。为继承而设计的方法应该是抽象的或空的,或者,如果不打算被继承,则应该是final