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();
}
}
}
运行结果图:
直观关系图: