誰的人所熟悉的橋模式,我們知道它使用的成分,包括具體實施者精緻抽象的一部分。所以基本上我們有望使用抽象作爲這種模式的客戶端。 /- 實施者 -/ 接口實現者擴展AutoClosable public void open(); public void close(); }如果在橋模式,抽象擁有AutoClosable實施者
/**--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的問題。就我而言,我會直接使用抽象的客戶端,並使用一個字符串作爲構造函數的參數,以確定我會用什麼樣的具體實施者。但是,這有點讓我在一個情況下,我不能使用try-與資源(抽象AB =新RefinedAbstraction(「implementorA」)),因爲編者會抱怨,我的抽象是不是AutoCloseable。將具體實例或實例放在try-with-resouces塊中是沒有意義的,因爲這是抽象接口中實際需要的方法。
解決這個問題的唯一方法是我可以想到的是,我可以在finally塊中使用try/catch來明確地關閉我的Abstraction.implementer,而不是嘗試使用try-with-resources。但這樣做意味着我必須增加實施者從保護到公共的可見性,這是不好的。
有什麼想法?或更好的方法呢?
謝謝,這就是我最後做的:)你的回答只是證實了它的正確性。我必須在我的抽象合約中抽象close()。然後RefinedAbstraction子類將調用委託給實現者。 – Shengjie 2012-04-10 16:48:32
@Shengjie:偉大的,你已經有它想通了! – 2012-04-10 17:00:48