2011-09-26 38 views
0

說我有一個類也是太脂肪一個具體案件的方法,但適合其中約一半,所以它是沒有辦法,只是擴大它。同時,我想隱藏一個事實,即我已經從最終用戶擴展了這個胖類。然後,我想限制一些新的接口類,並讓不需要的方法拋出UnsupportedOperationExceptionJava:我是否缺少限制模式?我需要限制實施只有選定的方法

public class TooFatClass { 
    public void usefulMethodOne() { ... }; 
    public void usefulMethodTwo() { ... }; 
    public void usefulMethodThree() { ... }; 
    ... 
    public void notUsefulMethodOne() { ... }; 
    public void notUsefulMethodTwo() { ... }; 
    public void notUsefulMethodThree() { ... }; 
    ... 
} 

public interface OnlyUsefulMethods { 
    public void usefulMethodOne(); 
    public void usefulMethodTwo(); 
    public void usefulMethodThree(); 
    ... 

    public static OnlyUsefulMethods create() { 
     return new OnlyUsefulMethodsImpl(); 
    } 
} 

// notice it is package-private 
class OnlyUsefulMethodsImpl extends TooFatClass implements OnlyUsefulMethods { 
    public void usefulMethodOne() { ... }; 
    public void usefulMethodTwo() { ... }; 
    public void usefulMethodThree() { ... }; 
    ... 
    public void notUsefulMethodOne() { throw new UnsupportedOperationException(); }; 
    public void notUsefulMethodTwo() { throw new UnsupportedOperationException(); }; 
    public void notUsefulMethodThree() { throw new UnsupportedOperationException(); }; 
    ...   
} 

所以,OnlyUsefulMethodsImpl例如可以強制轉換爲TooFatClass,如果用戶真正想要的,但它隱藏這個事實,不強迫用戶這樣做。

然而,Java不允許靜態方法的實現在接口(這是愚蠢的,使其OnlyUsefulMethods抽象的,我認爲),所以我用這個臭的代碼完成:

public interface OnlyUsefulMethods { 
    public void usefulMethodOne(); 
    public void usefulMethodTwo(); 
    public void usefulMethodThree(); 
    ... 

    public static final class Factory { 
     public static OnlyUsefulMethods create() { return new OnlyUsefulMethodsImpl(); } 
     public static OnlyUsefulMethods create(Options options) { 
       return new OnlyUsefulMethodsImpl(options); } 
    }  

} 

即使我」我會在界面之外移動一個Factory它看起來太複雜,不能用於一個類的情況下,我想要一個工廠方法,而不顯示OnlyUsefulMethodsImpl以外。

我做錯了什麼/太複雜,缺少一些限制模式?


可能涉及到這個問題(反正有一些答案,可能是合適的,我不知道):

回答

4

聲音像授權的好時機。

「瘦」類包裝「胖」類,只暴露「瘦」類的接口。有些IDE可以幫助您實施授權。

+1

是的,代表團在這種情況下是正確的。謝謝!我已經完成了它,但不知何故,代碼中的'OnlyUsefulMethods'接口仍然認爲它仍然是必需的。你睜開了眼睛,謝謝你! :) –

2
class OnlyUsefulMethods extends TooFatClass{ 
    public void usefulMethodOne() { ... }; 
    public void usefulMethodTwo() { ... }; 
    public void usefulMethodThree() { ... }; 
    ... 
    public void notUsefulMethodOne() { throw new UnsupportedOperationException(); }; 
    public void notUsefulMethodTwo() { throw new UnsupportedOperationException(); }; 
    public void notUsefulMethodThree() { throw new UnsupportedOperationException(); }; 
    ...   
} 

有時候我在想,爲什麼模式可以讓事情變得這麼複雜......無需廠房,你可以直接與new實例化。

您還可以使用組合模式將TooFatClass實例包裝在僅公開所需方法的類中。