2014-02-26 54 views
0

正如在許多實施例中所述(例如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

如果你生活中可以沒有裝飾,這樣做。 –

+0

AHAH,是的,我知道...這只是好奇... :) – davioooh

+0

是不是'ENTITY'應該是簡單的'T'? –

回答

0

你的代碼看起來像你想簡單地重用一個抽象方法的實施和應用一些轉換之後 - 如果使用第三方代碼,我會同意這種做法,但在這種情況下,你是在類層次,所以我的控制將你的ConcretePagerRepositoryPagerRepositoryConvertionDecorator將各自延伸出的抽象基類中提取共同的行爲。此外,覆蓋已經被覆蓋的抽象方法並不是特別好的編碼風格,因爲你是在偷偷地繼承代碼。爲繼承設計的方法應該是抽象的或空的,或者,如果不打算繼承,final