【问题标题】:Is Decorator Pattern respected?装饰器模式是否受到尊重?
【发布时间】:2014-02-26 10:56:25
【问题描述】:

如许多示例中所述(例如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);
}

这是一个正确的装饰器模式实现吗?

【问题讨论】:

  • 如果你可以没有装饰器,那就这样做吧。
  • 啊,是的,我确定...这只是好奇... :)
  • ENTITY不应该只是T吗?
  • @Riccardo 你是对的。
  • 它可能是一个适配器 - 在隐蔽接口中 - 从 PagerRepository 到 PagerRepository?它不添加/隐藏方法,所以看起来像一个装饰器。

标签: java design-patterns


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-01-20
    • 2021-04-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    相关资源
    最近更新 更多