0

たとえば、1つの具体的なケースにはメソッドが多すぎるクラスがあります、それらの約半分に収まるので、それを拡張するしかありません。同時に、このファットクラスをエンドユーザーから拡張したという事実を隠したいと思います。UnsupportedOperationException次に、そのクラスをいくつかの新しいインターフェイスで制限し、不要なメソッドに:をスローさせたいと思います。

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、1つのクラスのケースだけに使用するには複雑すぎるように見えますが、外側に表示せずにファクトリメソッドが必要ですOnlyUsefulMethodsImpl

私は何か間違っている/複雑すぎて、いくつかの制限パターンが欠けていますか?


この質問に関連している可能性があります(とにかく、適切な答えがいくつかありますが、よくわかりません):

4

2 に答える 2

4

代表団にとって良い時期のように聞こえます。

「leaner」クラスは「fat」クラスをラップし、「leaner」クラスのインターフェースのみを公開します。一部のideは、委任の実装に役立ちます。

于 2011-09-26T09:41:46.567 に答える
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インスタンスをラップすることもできます。

于 2011-09-26T09:42:09.810 に答える