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