2012-04-10 46 views
4

誰的人所熟悉的橋模式,我們知道它使用的成分,包括具體實施者精緻抽象的一部分。所以基本上我們有望使用抽象作爲這種模式的客戶端。 enter image description here /- 實施者 -/ 接口實現者擴展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。但這樣做意味着我必須增加實施者從保護到公共的可見性,這是​​不好的。

有什麼想法?或更好的方法呢?

回答

1

您可以將Abstraction本身設爲AutoCloseable並將close()留空。然後,組成可自動切斷的子類將覆蓋close以將調用委託給組合對象。然後,您的客戶端可以把所有Abstraction S作爲autocloseable並與他們一貫使用try-與資源進行交互。

+0

謝謝,這就是我最後做的:)你的回答只是證實了它的正確性。我必須在我的抽象合約中抽象close()。然後RefinedAbstraction子類將調用委託給實現者。 – Shengjie 2012-04-10 16:48:32

+0

@Shengjie:偉大的,你已經有它想通了! – 2012-04-10 17:00:48