4

对于熟悉桥接模式的人来说,我们知道它使用组合将具体实现者作为精炼抽象的一部分。所以基本上我们应该使用抽象作为这个模式的客户端。 在此处输入图像描述 / --Implementer-- / Interface Implementer extends AutoClosable { public void open(); 公共无效关闭();}

/**--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(Abstraction ab = new RefinedAbstraction("implementorA")),因为 Complier 会抱怨我的抽象不是 AutoCloseable。将concreteImplementor 实例放在try-with-resources 块中是没有意义的,因为这是Abstraction Interface 中真正想要的方法。

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

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

4

1 回答 1

1

您可以将Abstraction自己设为 anAutoCloseableclose()留空。然后,组成自动关闭对象的子类将覆盖close以将调用委托给组合对象。然后,您的客户端可以将所有Abstractions 视为可自动关闭的,并通过使用 try-with-resources 与它们进行一致的交互。

于 2012-04-10T16:40:30.570 回答