zoukankan      html  css  js  c++  java
  • Command模式实例(C#)

    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();
            }
        }
    }
    

    运行结果图:

     

    直观关系图:

     

  • 相关阅读:
    C#判断闰年
    C#计算时间,107653秒是几天几小时几分钟几秒?
    两个值交换,不使用第三个中间变量做缓存。实现方法
    element UI dialog 固定高度 且关闭时清空数据
    JS
    PHP
    element UI 上传文件成功后
    windows环境安装vue-cli及webpack并创建vueJs项目
    PHP
    mysql点滴记录 三 (基础操作)
  • 原文地址:https://www.cnblogs.com/NewWork/p/3260554.html
Copyright © 2011-2022 走看看