如果在桥接模式中,Abstraction有一个AutoCloseable实现者

时间:2012-04-10 14:31:53

标签: java design-patterns uml

对于熟悉桥模式的人,我们知道它使用组合将具体实现者包含在精炼抽象中。所以基本上我们应该使用抽象作为这种模式的客户。 enter image description here     /的 - 实施者 - /     Interface Implementer扩展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(Abstraction ab = new RefinedAbstraction(“implementorA”)),因为Complier会抱怨我的抽象不是AutoCloseable。将concreteImplementor实例放在try-with-resouces块中是没有意义的,因为这是实际上想要的抽象接口中的方法。

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

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

1 个答案:

答案 0 :(得分:1)

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