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(); }}
复制代码
编译并运行程序,输出如下结果:
评论