客户端软件开发的时候,控件会有各种的事件可以进行绑定,例如:TextBox 的 TextChanged 事件,Button 的 Clicked 事件,ComboBox 的 SelectedIndexChanged 事件等等。在一个软件里,会存在具有相同逻辑结构抽象逻辑集合,例如:TextBox里只允许输入整数,所有的按钮在鼠标进入、鼠标点击、鼠标释放、取得焦点时会有不同的动态效果。这些都可以用事件绑定的方式来实现,但是如果一个个的去绑定事件,然后实现相应逻辑的话,会产生非常多的重复和冗余的代码,给维护带来非常高昂的代价,也不符合面向对象的思想。因此,我们可以对具有相同逻辑结构抽象逻辑集合进行重新定义,定义为一种逻辑的原子单位——行为。
下面用简单的示例代码来解释行为的定义:
一、定义行为抽象类:
///
/// 行为的基类
///
///
public abstract class BehaviorBase
{
#region Fields
///
/// The attach element.
///
private T m_AttachElement;
#endregion
#region Properties
///
/// Gets or sets the attach element.
///
public T AttachElement
{
get
{
return this.m_AttachElement;
}
set
{
this.m_AttachElement = value;
}
}
#endregion
#region Interface
///
/// 附加行为到指定对象
///
///
public void Attach(T element)
{
this.m_AttachElement = element;
this.AttachBehavior();
}
///
/// 卸载行为
///
public void Deattach()
{
this.DeattachBehavior();
}
#endregion
#region Virtual
///
/// Attaches the behavior to the element.
///
protected abstract void AttachBehavior();
///
/// Deataches the element's behavior.
///
protected abstract void DeattachBehavior();
#endregion
}
二、子类继承后,实现抽象方法 AttachBehavior 和 DeattachBehavior 即可
///
/// 使TextBox拥有只能输入数字的行为
///
public class TextBoxIntOnlyBehavior : BehaviorBase
{
#region Public Properties
///
/// 记录数字输入的最近一次正确值,默认值为0
///
public int ControlsIntOnlyRecord { get; set; }
#endregion
#region Override
protected override void AttachBehavior()
{
this.AttachElement.KeyPress += new KeyPressEventHandler(this.ControlsIntOnly_KeyPress);
this.AttachElement.TextChanged += new EventHandler(this.ControlsIntOnly_TextChanged);
this.AttachElement.Leave += new EventHandler(this.ControlsIntOnly_Leave);
}
protected override void DeattachBehavior()
{
this.AttachElement.KeyPress -= new KeyPressEventHandler(this.ControlsIntOnly_KeyPress);
this.AttachElement.TextChanged -= new EventHandler(this.ControlsIntOnly_TextChanged);
this.AttachElement.Leave -= new EventHandler(this.ControlsIntOnly_Leave);
}
#endregion
#region Events
public void ControlsIntOnly_KeyPress(object sender, KeyPressEventArgs e)
{
if (!(Char.IsDigit(e.KeyChar) || char.IsControl(e.KeyChar)))
{
e.Handled = true;
}
if (e.KeyChar == (char)Keys.Enter)
{
e.Handled = true;
ControlsIntOnly_Leave(sender, null);
}
}
public void ControlsIntOnly_TextChanged(object sender, EventArgs e)
{
try
{
int TempInt = int.Parse(((TextBox)sender).Text);
ControlsIntOnlyRecord = TempInt;
}
catch
{
}
}
public void ControlsIntOnly_Leave(object sender, EventArgs e)
{
TextBox TheIntTextbox = (TextBox)sender;
try
{
int.Parse(TheIntTextbox.Text);
}
catch
{
TheIntTextbox.Text = ControlsIntOnlyRecord.ToString();
}
}
#endregion
}
后期可以使用工厂方式,实现独立的创建和管理模式。