某软件公司欲开发一个基于Windows平台的公告板系统。系统提供一个主菜单(Menu),在主菜单中包含了一些菜单项(MenuItem),可以通过Menu类的addMenuItem()方法增加菜单项。菜单项的主要方法是click(),每一个菜单项包含一个抽象命令类,具体命令类包括OpenCommand(打开命令),CreateCommand(新建命令),EditCommand(编辑命令)等,命令类具有一个execute()方法,用于调用公告板系统界面类(BoardScreen)的open()、create()、edit()等方法。现使用命令模式设计该系统,使得MenuItem类与BoardScreen类的耦合度降低,绘制类图并编程实现。
类图:
实现代码:
抽象命令类Command : package CommandPattern2;
public abstract class Command { public abstract void execute(); }
具体命令类CreateCommand : package CommandPattern2;
public class CreateCommand extends Command { private BoardScreen boardScreen; public CreateCommand(BoardScreen boardScreen) { super(); this.boardScreen = boardScreen; } @Override public void execute() { boardScreen.create(); } } 具体命令类OpenCommand : package CommandPattern2;
public class OpenCommand extends Command{ private BoardScreen boardScreen;
public OpenCommand(BoardScreen boardScreen) { super(); this.boardScreen = boardScreen; } @Override public void execute() { boardScreen.open(); } } 具体命令类EditCommand : package CommandPattern2;
public class EditCommand extends Command { private BoardScreen boardScreen; public EditCommand(BoardScreen boardScreen) { super(); this.boardScreen = boardScreen; } @Override public void execute() { boardScreen.edit(); } }
Menu类:
package CommandPattern2;
import java.util.ArrayList; import java.util.List;
public class Menu { private List<MenuItem> menuItemList = new ArrayList();
public void addMenuItem(MenuItem menuItem){ menuItemList.add(menuItem); }
public List<MenuItem> getMenuItemList() { return menuItemList; }
public void setMenuItemList(List<MenuItem> menuItemList) { this.menuItemList = menuItemList; }
}
package CommandPattern2;
public class MenuItem {
private String menuItemName; private Command Command; public MenuItem(String menuItemName) { super(); this.menuItemName = menuItemName; } public String getMenuItemName() { return menuItemName; } public void setMenuItemName(String menuItemName) { this.menuItemName = menuItemName; } public Command getCommand() { return Command; } public void setCommand(Command command) { Command = command; }
public void click(){ Command.execute(); } } 接收者BoardScreen : import java.util.List; public class BoardScreen {
private Menu menu;
public Menu getMenu() { return menu; } public void setMenu(Menu menu) { this.menu = menu; } public BoardScreen() { super(); menu = new Menu(); } public void open(){ System.out.println("调用open方法"); }
public void create(){ System.out.println("调用create方法"); } public void edit(){ System.out.println("调用edit方法"); } public void show(){ System.out.println("调用show方法"); Command openCommand,createCommand,editCommand; //初始化 openCommand = new OpenCommand(this); createCommand = new CreateCommand(this); editCommand = new EditCommand(this); //初始化菜单 MenuItem openMenuItem = new MenuItem("打开"); openMenuItem.setCommand(openCommand); MenuItem createMenuItem = new MenuItem("创建"); createMenuItem.setCommand(createCommand); MenuItem editMenuItem = new MenuItem("编辑"); editMenuItem.setCommand(editCommand); //菜单项加入菜单 menu.addMenuItem(openMenuItem); menu.addMenuItem(createMenuItem); menu.addMenuItem(editMenuItem); System.out.println("显示界面"); System.out.println("-------------------------------"); List<MenuItem> menuItems = menu.getMenuItemList(); for(MenuItem m:menuItems){ System.out.println(m.getMenuItemName()+"菜单项被点击!"); m.click(); } } } 客户端类Client :
public class Client {
public static void main(String[] args) { BoardScreen boardScreen = new BoardScreen(); boardScreen.show();
} } |