命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。
定义:
命令模式:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。
命令模式包含以下4个角色:
//请求调用者
/**
* 菜单项,充当请求调用者
*/
public class MenuItem {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void click(){
System.out.println("单击功能键:");
command.execute();
}
}
/**
* 主菜单
*/
public class Menu {
private ArrayList
//抽象命令类
/**
* 抽象命令类
*/
public abstract class Command {
public abstract void execute();
}
//具体命令类
/**
* 创建命令类,具体命令类
*/
public class CreateCommand extends Command{
private BoardScreen boardScreen;
public CreateCommand(BoardScreen boardScreen){
this.boardScreen = boardScreen;
}
@Override
public void execute() {
boardScreen.create();
}
}
/**
* 编辑命令类,具体命令类
*/
public class EditCommand extends Command{
private BoardScreen boardScreen;
public EditCommand(BoardScreen boardScreen){
this.boardScreen = boardScreen;
}
@Override
public void execute() {
boardScreen.edit();
}
}
/**
* 打开命令类,具体命令类
*/
public class OpenCommand extends Command{
private BoardScreen boardScreen;
public OpenCommand(BoardScreen boardScreen){
this.boardScreen = boardScreen;
}
@Override
public void execute() {
boardScreen.open();
}
}
//请求接收者
/**
* 公告板系统界面类
*/
public class BoardScreen {
public void open(){
System.out.println("公告板界面打开功能");
}
public void create(){
System.out.println("公告板界面创建功能");
}
public void edit(){
System.out.println("公告板界面编辑功能");
}
}
//客户端
public class Client {
public static void main(String[] args) {
/**
* 案例需求描述:
* 开发一个公告板系统,系统提供一个主菜单Menu,在主菜单中包含了一些菜单项MenuItem,
* 可以通过Menu类的addMenuItem()方法增加菜单项。
* 菜单项的主要方法是click(),每一个菜单项包含一个抽象命令类,具体命令类包括openCommand(打开命令),
* createCommand(新建命令),editCommand(编辑命令)等,命令类有一个execute()方法,
* 用于调用公告板系统界面类(BoardScreen)的open(),create(),edit()等方法。
* 请使用命令模式设计该系统。
*/
BoardScreen boardScreen = new BoardScreen();
Command create, edit, open;
create = new CreateCommand(boardScreen);
edit = new EditCommand(boardScreen);
open = new OpenCommand(boardScreen);
MenuItem menuItem = new MenuItem();
menuItem.setCommand(create);
menuItem.click();
menuItem.setCommand(edit);
menuItem.click();
menuItem.setCommand(open);
menuItem.click();
Menu menu = new Menu();
menu.addMenuItem(menuItem);
}
}
【参考文献】:
本文是根据刘伟的《Java设计模式》一书的学习笔记,仅供学习用途,勿做其他用途,请尊重知识产权。
【本文代码仓库】:https://gitee.com/xiongbomy/java-design-pattern.git