1.1. Commands
1.1.1. 类关系图
图 2?6 主要类关系图
说明:
1. Command定义了一个命令,如“FileExit”,它跟一系列的CommandAdapter相关,好比一个命令可以从多个地方下发(菜单或工具栏等等)。
2. Command持有一个ICommandAdapterMapService接口,也正是这个接口,通过void Register(Type invokerType, Type adapterType)完成了后期的扩展,比如添加自定义的CommandAdapter。
3. 在各个CommandAdapter中触发的事件最终都是调用Command中的事件处理程序,这样的设计很显然是为了保持命令的一致性,如果菜单和工具栏上同样的命令,操作却不一样,那就神奇了J,请看Command中的代码:
public virtual void AddCommandAdapter(CommandAdapter adapter)
{
adapter.ExecuteCommand += this.OnExecuteAction;
adapter.BindCommand(this);
adapters.Add(adapter);
}
1.1.2. 接口定义
图 2?7 ICommandAdapterMapService
其中CommandAdapterMapService是CAB提供的默认实现。
1.1.3. 接口协作
图 2?8接口协作
说明:
1. 在Register时,是根据具体类型添加相应的CommandAdapter,比如
图 2?9 注册自定义的CommandAdapter
因此在调用AddInvoker时传入ClickableTreeNode类型实例时,将会调用到TVClickableNodeCommandAdapter进行事件的注册。
WindowsFormsApplication基础类中默认提供了两种Adapter。
private void RegisterCommandAdapters()
{
ICommandAdapterMapService mapService = RootWorkItem.Services.Get<ICommandAdapterMapService>();
mapService.Register(typeof(ToolStripItem), typeof(ToolStripItemCommandAdapter));
mapService.Register(typeof(Control), typeof(ControlCommandAdapter));
}