如何剥离具体动作的具体实现,怎么说呢,比如:一个人在路上散步,此时遇到朋友时,你会对其说:hello;如果遇到车辆时,你会及时让开它,以免受伤。。
从技术角度来说:
Client即是一个场景
Action即是具体执行动作的
FailedEventArgs即是自定义的事件类
CustomerEventProvider即是一个事件提供者
此code的另一个好处:扩展性还是比较不错。如果要处理要的动作时,只需要更改"具体的实现"即可。
其实如果动作多的话,用Command模式,或者你认为可以的模式都是可以。反正具体情况具体调配吧,
此程序:我使用定义事件的方式,来剥离具体动作的具体实现。Come on Beat!
程序如下:
////调用处
new Client( "Car" );
///
public class Client
{
CustomerEventProvider cep;
public Client ( String fallAcross ) {
cep = new CustomerEventProvider();
///当其散步之前,预先定义几个事件(即动作),遇到情况时自动去执行具体的动作,给于反应。
cep.OnFailed += new CustomerEventProvider.FailedHandler( Action.Failed );
cep.OnSuccess += new CustomerEventProvider.SuccessHandler( Action.Success );
Walk( fallAcross );
}
public void Walk ( String fallAcross ) {
///这里写的几点粗糙,这里可以用具体的模式,弃用if,else.
///我在这里就不写。反正就是提供一个思路
if ( fallAcross.Equals( "People" ) ) {
cep.ShowSuccess( this , new EventArgs() );
}
else {
FailedEventArgs fea = new FailedEventArgs();
cep.ShowFailed( this , fea );
}
}
}
/// <summary>
/// 具体执行动作的类,具体实现可以在这里规化。
/// </summary>
public class Action
{
public static void Success ( Object Sender , EventArgs e ) {
Console.WriteLine( "Success" );
}
public static void Failed ( Object Sender , FailedEventArgs e ) {
e.EventMessage = "Failed";
Console.WriteLine( e.EventMessage );
}
}
/// <summary>
/// 自定义事件类
/// 用于:定义一些EventCode,Message Etc.
/// </summary>
public class FailedEventArgs : EventArgs
{
private String eventCode;
public String EventCode {
get { return eventCode; }
set { eventCode = value; }
}
private String eventMessage;
public String EventMessage {
get { return eventMessage; }
set { eventMessage = value; }
}
}
/// <summary>
/// 事件提供者,定义各种的动作
/// </summary>
public class CustomerEventProvider
{
public delegate void FailedHandler ( object sender , FailedEventArgs e );
public event FailedHandler OnFailed;
public void ShowFailed ( object sender , FailedEventArgs e ) {
if ( OnFailed != null ) {
OnFailed( sender , e );
}
}
public delegate void SuccessHandler ( object sender , EventArgs e );
public event SuccessHandler OnSuccess;
public void ShowSuccess ( object sender , EventArgs e ) {
if ( OnSuccess != null ) {
OnSuccess( sender , e );
}
}
}