2012-02-19 62 views
1

我想執行一個函數,但在此之前,我想驗證密碼。代理設計模式封裝解決方案?

我選擇使用代理設計模式。


文字

創建代理類,

發送密碼,

,並告訴他什麼函數來執行如果密碼正確。

問題是根據代理模式,整個內部應該/最好是私有的。

所以 - 我不能從方法1/2外看到...

,我不想做Method1/2public(我不想當的)。我想使用代表。

那麼,我怎麼能(從外面)給他一個有效的Action param? (ac param)

我是否應該爲每個函數創建一個公共行爲?

enter image description here

回答

2

通常情況下要執行的方法不應該是你的代理類的一部分。這是這個類的調用者傳遞一個方法:

public class ProxyClass 
{ 
    public ProxyClass(string password, Action ac) 
    { 
     if (password == "111") 
     { 
      ac(); 
     } 
    } 
} 

,然後你可以傳遞一個Action作爲第二個參數:

var proxy = new ProxyClass("111",() => 
{ 
    ... some code that you want to execute in case of success 
}); 

,或者如果您已經定義了一些方法:

public class Foo 
{ 
    public void Success() 
    { 
     ... some code that you want to execute in case of success 
    } 
} 

您可以:

var foo = new Foo(); 
var proxy = new ProxyClass("111", foo.Success); 
,如果成功是你不需要的 Foo實例的靜態方法

var proxy = new ProxyClass("111", Foo.Success); 
+0

所以方法1/2()應該是代理的調用者可見? – 2012-02-19 11:55:23

+0

@RoyiNamir,好吧,如果你像代理那樣在代理中定義它們,那麼是的,它們應該是可見的,以便調用者可以決定調用哪一個。如果這些方法不是你的代理類的一部分,那麼調用者可以從別的地方傳遞它們。但是,當然,由於調用者需要將Action作爲第二個參數傳遞給構造函數,因此調用者應該知道此Action。 – 2012-02-19 11:56:56

+0

對我來說似乎很奇怪,它的一個設計模式是它的用法是訪問控制 - 強制我把這些方法公諸於衆/對所有人都是可見的..... – 2012-02-19 11:58:31