2012-02-19 58 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