设计模式-命令模式

某软件公司欲开发一个基于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;

    }

 

 

 

}


调用者MenuItem 

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 
package CommandPattern2;

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 
package CommandPattern2;

 

public class Client {

 

    public static void main(String[] args) {

        BoardScreen boardScreen = new BoardScreen();

        boardScreen.show();

 

    }

}


  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值