Closed. This question is opinion-based。它当前不接受答案。












想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。

2年前关闭。



Improve this question




对于熟悉桥梁模式的人们,我们知道它使用组合将具体实现者包括在精致抽象中。因此,基本上,我们应该将Abstraction用作此模式的客户端。

/ -实现者- /
接口实施者扩展了AutoClosable {
public void open();
public void close();
}
/**--Concrete ImplementerA--**/
ImplementerA implements Implementer {
    public void open(){....};
    public void close(){......};
}
/**--Abstration--**/
public abstract class Abstraction {
    protected Implementer implementer;
    public methodAIwant2use();
    public methodBIwant2use();
}
/**--Refined Abstration--**/
public class RefinedAbstraction {
    public RefinedAbstraction(String Implementer) {
        this.implementer=Implementer;
    }
    public methodAIwant2use();
    public methodBIwant2use();
}

如上面的代码所示,我遇到了一个问题,我的实现者恰巧是一个AutoClosable。就我而言,我将直接在客户端使用Abstraction并将字符串作为构造函数参数来确定将使用的具体实现者。但这有点使我处于无法使用try-with-resources(抽象ab = new RefinedAbstraction(“implementorA”))的情况下,因为Complier会抱怨我的抽象不是AutoCloseable。将具体的Implementor实例放在try-with-resouces块中是没有意义的,因为这是Abstraction Interface实际上在这里想要的方法。

解决这个问题的唯一方法是,可以使用try / catch和finally块来显式关闭Abstraction.implementer,而不必尝试使用try-with-resources。但是这样做意味着我必须提高实现者从受保护者到公众的可见度,这是不好的。

有什么想法吗?或更好的方法呢?

最佳答案

您可以将Abstraction本身设置为AutoCloseable,并将close()留空。组成自动关闭对象的子类将覆盖close,以将调用委派给组成的对象。然后,您的客户端可以将所有Abstraction视为可自动关闭,并通过使用try-with-resources与它们持续进行交互。

09-26 20:52