写点什么

设计模式的艺术 第十七章命令设计模式练习(开发一个基于 Windows 平台的公告板系统。该系统提供了一个主菜单(Menu),主菜单包含一些菜单项,Menu 类可以增加菜单项。菜单项主要方法是 click(),每个菜单项包含一个抽象命令类)

作者:代廉洁
  • 2022 年 9 月 02 日
    浙江
  • 本文字数:2056 字

    阅读完需:约 7 分钟

Sunny 软件公司欲开发一个基于 Windows 平台的公告板系统。该系统提供了一个主菜单(Menu),在主菜单中包含了一些菜单项(MenuItem),可以通过 Menu 类的 addMenuItem()方法增加菜单项。菜单项的主要方法是 click(),每一个菜单项包含一个抽象命令类。具体命令类包括 OpenCommand(打开命令)、CreateCommand(新建命令)、EditCommand(编辑命令)等。命令类具有一个 execute()方法,用于调用公告板系统(BoardScreen)的 open()、create()、edit()等方法。试使用命令模式设计该系统,以便降低 MenuItem 类与 BoardScreen 类之间的耦合度。


一、类结构图



抽象命令类:设计为名称为 Command 的抽象类,包含抽象方法 execute(),持有一个具体接收者类的引用;

具体命令类:设计为抽象命令者类 Commad 的子类,包括具体命令类 OpenCommand、具体命令类 CreateCommand、具体命令类 EditCommand,实现抽象命令者类的抽象方法 execute();

具体接收者类:设计为名称为 BoardScreen 的具体类,实现具体方法 open()、具体方法 create()、具体方法 edit();

具体调用者类:设计为名称为 MenuItem 的具体类,面向抽象命令类编程,持有一个抽象命令类的引用,包含具体方法 setCommand(Command commnad)、具体方法 onClick(),具体方法 onClick()内部引用抽象命令类执行。

具体调用者容器类:设计为名称为 Menu 的具体类,面向具体调用者类编程,持有一个具体调用者类的 list,实现具体方法 setTitle()、addMenuItem(MenuItem menuItem)、具体方法 removeMenuItem(MenuItem menuItem)。

二、典型实现代码

抽象操作命令类:抽象命令类
// 抽象操作命令类:抽象命令类public abstract class Command {    protected BoardScreen boardScreen = new BoardScreen();        public abstract void execute();}
复制代码


打开公告板系统界面命令类:具体命令类
// 打开公告板系统界面命令类:具体命令类public class OpenCommand extends Command {    @Override    public void execute() {        this.boardScreen.open();    }}
复制代码


创建公告板系统界面命令类:具体命令类
// 创建公告板系统界面命令类:具体命令类public class CreateCommand extends Command{    @Override    public void execute() {        this.boardScreen.create();    }}
复制代码


编辑公告板系统界面命令类:具体命令类
// 编辑公告板系统界面命令类:具体命令类public class EditCommand extends Command{    @Override    public void execute() {        this.boardScreen.edit();    }}
复制代码


具体公告板系统界面类:具体接收者类
// 具体公告板系统界面类:具体接收者类public class BoardScreen {    public void open() {        System.out.println("公告板系统界面打开");    }
public void create() { System.out.println("公告板系统界面创建"); }
public void edit() { System.out.println("公告板系统界面编辑"); }}
复制代码


具体菜单项类:具体调用者类
// 具体菜单项类:具体调用者类public class MenuItem {    private String name;    private Command command;        public MenuItem(String name) {        this.name = name;    }
public void setCommand(Command command) { this.command = command; }
public void onClick() { command.execute(); }}
复制代码


具体主菜单类:具体调用者容器类
// 具体主菜单类:具体调用者容器类public class Menu {    private String title;    private ArrayList<MenuItem> list = new ArrayList<MenuItem>();
public Menu(String title) { this.title = title; }
public void addMenuItem(MenuItem menuItem) { this.list.add(menuItem); }
public void removeMenuItem(MenuItem menuItem) { this.list.remove(menuItem); }}
复制代码


客户端代码:
public class Client {    public static void main(String[] args) {        Menu menu = new Menu("主菜单");
MenuItem openMenuItem, createMenuItem, editMenuItem; openMenuItem = new MenuItem("打开菜单项"); createMenuItem = new MenuItem("创建菜单项"); editMenuItem = new MenuItem("编辑菜单项");
Command openCommand, createCommand, editCommand; openCommand = new OpenCommand(); createCommand = new CreateCommand(); editCommand = new EditCommand();
openMenuItem.setCommand(openCommand); createMenuItem.setCommand(createCommand); editMenuItem.setCommand(editCommand);
menu.addMenuItem(openMenuItem); menu.addMenuItem(createMenuItem); menu.addMenuItem(editMenuItem);
openMenuItem.onClick(); editMenuItem.onClick(); }}
复制代码


编译并运行程序,输出如下结果:
公告板系统界面打开公告板系统界面编辑
复制代码


发布于: 刚刚阅读数: 3
用户头像

代廉洁

关注

还未添加个人签名 2019.10.15 加入

还未添加个人简介

评论

发布
暂无评论
设计模式的艺术 第十七章命令设计模式练习(开发一个基于Windows平台的公告板系统。该系统提供了一个主菜单(Menu),主菜单包含一些菜单项,Menu类可以增加菜单项。菜单项主要方法是click(),每个菜单项包含一个抽象命令类)_设计模式的艺术_代廉洁_InfoQ写作社区