0

假设我有一些类对于一个具体案例来说方法过于丰富,但适合其中的一半左右,所以只能扩展它。同时,我想向最终用户隐藏我已经扩展了这个胖类的事实。然后我想用一些新接口限制那个类,让不需要的方法抛出一个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接口外部,它看起来太复杂而无法仅用于一个类案例,我想要一个工厂方法而不显示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 回答