2014-10-09 88 views
0

可以說我有一個類,需要一個委託:委託模式是否破壞封裝?

public class DelegateContainer 
{ 
    private IDelegate delegate; 

    public DelegateContainer(IDelegate delegate) 
    { 
     this.delegate = delegate; 
    } 

    public void doSomething() 
    { 
     delegate.doSomethingOnlyForThisPurpose(); 
    } 
{ 

正如你可以看到委託的doSomethingOnlyForThisPurpose()方法只存在於由委託類調用。但是這個方法是公開的,並且可以由任何東西執行。如果它絕對不應該被它所附加的委託類之外的任何東西執行(特別是如果委託類傳入一個依賴),那麼這不會破壞封裝嗎?我認爲解決這個問題的唯一方法是設計一個對象,該對象只能由傳遞給每個調用方法的委託類(內部類)實例化。然而,這是非常複雜的,而不是無論如何不水密。有沒有辦法解決這個問題還是病理性的?

注:我想堅持這種構圖方法,所以我寧願不訴諸繼承。

回答

0

它不應該打破封裝。您的IDelegate實現發佈了一些行爲,任何人都可以引用這個行爲,因此應該像所有其他公共行爲一樣實施所需的抽象。如果你想讓任何人擁有一個實例,你可以公開你的構造函數。如果你不這樣做,那麼你喜歡你做的事情(使用私有或受保護的構造函數)。

IDelegate.doSomethingOnlyForThisPurpose實現的目的應該是做它做的事情,無論是否被DelegateContainer調用。我的意思是,如果這種方法如果被「錯誤的手」調用是危險的,那麼它與DelegateContainer緊密耦合。在這種情況下,不是委託模式誰打破封裝。

只是一個快速注:

我不知道你使用的是什麼語言。在C#可以實現IDelegate.doSomethingOnlyForThisPurpose明確地由那些誰在這個界面特別感興趣的使用:

class MyClass: IDelegate 
{ 

    void IDelegate.doSomethingOnlyForThisPurpose() { 

     // This method is only visible by 
     // who is representing your object as IDelegate. 
     // It's not visible by who is representing it as MyClass. 
    } 
} 

結論:你不應該有所謂的doSomethingOnlyForThisPurpose如果「OnlyForThisPurpose」非私有方法意味着它是不安全的(你已經知道這一點),並且如果你「害羞」地發佈它(這是個壞消息),你不應該在你的課堂之外調用你的方法(通過DelegateContainer)。這是一個設計問題,但不是代理模式病理。