Command模式執行個體(C#)
用命令模式設計一個公告板系統模組:
某軟體公司欲開發一個基於Windows平台的公告板系統。系統提供一個主菜單(Menu),在主菜單中包含了一些功能表項目(MenuItem),可以通過Menu類的addMenuItem()方法增加功能表項目。功能表項目的主要方法是click(),每一個功能表項目包含一個抽象命令類,具體命令類包括OpenCommand(開啟命令),CreateCommand(建立命令),EditCommand(編輯命令)等,命令類具有一個execute()方法,用於調用公告板系統介面類(BoardScreen)的open()、create()、edit()等方法。現使用命令模式設計該系統,使得MenuItem類與BoardScreen類的耦合度降低,繪製類圖並編程實現。
類圖:
類圖說明:
由類圖可見,Command抽象類別下面實現了三個具體的類,分別是CreateCommand類、EditCommand類和OpenCommand類。然後是一個Invoker——MenuItem類,Receiver——BoardScreen類。Program類可以作為用戶端的調用。
各類源碼:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace CommandMenu{ //receiver類 public class BoardScreen { public void Open() { Console.WriteLine("Open Command Excute!"); } public void Create() { Console.WriteLine("Create Command Excute!"); } public void Edit() { Console.WriteLine("Edit Command Excute!"); } } //Command類 public abstract class Command { protected BoardScreen boardScreen; public Command(BoardScreen boardScreen) { this.boardScreen = boardScreen; } abstract public void Execute(); } //具體的command類 public class OpenCommand : Command { public OpenCommand(BoardScreen boardScreen) : base(boardScreen) { } public override void Execute() { //throw new NotImplementedException(); boardScreen.Open(); } } public class CreateCommand : Command { public CreateCommand(BoardScreen boardScreen) : base(boardScreen) { } public override void Execute() { //throw new NotImplementedException(); boardScreen.Create(); } } public class EditCommand : Command { public EditCommand(BoardScreen boardScreen) : base(boardScreen) { } public override void Execute() { //throw new NotImplementedException(); boardScreen.Edit(); } } //Invoker類 public class MenuItem { private Command command; public void addMenuItem(Command command) { this.command = command; } public void click() { command.Execute(); } } //用戶端類 class Program { static void Main(string[] args) { BoardScreen boardScreen = new BoardScreen(); MenuItem menuItem = new MenuItem(); //使用OpenCommand類 Command openCommand = new OpenCommand(boardScreen); menuItem.addMenuItem(openCommand); menuItem.click(); //使用CreateCommand類 Command creatCommand=new CreateCommand(boardScreen); menuItem.addMenuItem(creatCommand); menuItem.click(); //使用EditCommand類 Command editCommand = new EditCommand(boardScreen); menuItem.addMenuItem(editCommand); menuItem.click(); Console.ReadKey(); } }}
運行結果圖:
直觀關係圖: