圖 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);
}
圖 2?7 ICommandAdapterMapService
其中CommandAdapterMapService是CAB提供的默認實現。
圖 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));
}