Command模式接口适配器实现一例
Command模式在开发过程比较常用的一种模式,以下描述自己对这个模式的使用描述(对于Command模式的定义就不描述,网上有更多详细的)。在开发数据持久化组件里采用Command模式描述数据访问对象的规则:
/// <summary>
/// 数据操作接口
/// </summary>
public interface IDataAccess
{
/// <summary>
/// 数据操作执行方法
/// </summary>
void Execute();
}
为了搞灵活性和方便扩展通常实现相关的抽象适配器,对于适配器的实现描述两种式(对于两种实现的差别在后面会描述)。
Adapter1(直接实现相关接口)
public abstract class Adapter1 : IDataAccess
{
#region IDataAccess 成员
public virtual void Execute()
{
}
#endregion
}
Adapter2(采用了Template Method 模式)
public abstract class Adapter2:IDataAccess
{
#region IDataAccess 成员
public void Execute()
{
OnExecute();
}
protected virtual void OnExecute()
{
}
#endregion
}
针对可扩展性适配器对象可能添加相关的成员帮助扩展,这里只是大概描述一下所以比较简单。
在实际应用中自己会使用第二种方法去实现适配器对象,因为后者更具扩展性。为了证实这一点实现不同适配器的派生对象:
Adapter1的派生实现:
public class Adapter1Impl_A : Adapter1
{
public override void Execute()
{
}
}
public class Adapter1Impl_B : Adapter1
{
public override void Execute()
{
base.Execute();
}
}
Adapter2的派生实现
public class Adapter2Impl_A : Adapter2
{
protected override void OnExecute()
{
}
}
public class Adapter2Impl_B : Adapter2
{
protected override void OnExecute()
{
base.OnExecute();
}
}
现在面对一个需求添加日志处理,因为Adapter1有些派生类在面对特殊需求的情况下并没有调用基类方法,因此实现统一日志处理就比较麻烦。那对于Adapter2来说又怎样呢,下面是Adapter2实现统一日志处理方法(显然Adapter1是不能这么方便实现的)。
Adapter2的日志实现:
public abstract class Adapter2:IDataAccess
{
#region IDataAccess 成员
public void Execute()
{
OnExecute();
OnWriteLog();
}
protected virtual void OnExecute()
{
}
protected virtual void OnWriteLog()
{
}
#endregion
}
以上实现除了可以在Adapter2中统一实现日志处理外,派生类可以根据自己情况重写自己的日志处理;这样实现除了可以保证Adapter2代码的封装性外还提供灵活的扩展性。
以下是实现命令接口处理的方法(只是简单的实现):
public static void DoExecute(params IDataAccess[] accesss)
{
if (accesss == null)
return;
foreach (IDataAccess item in accesss)
{
item.Execute();
}
}
以上是自己在使用模式的一些心得,如果以上使用存在什么问题请大家多提意见。