【Java】java23种设计模式案例之命令模式


title: 【Java】java23种设计模式案例之命令模式
date: 2019-03-26
tags: java

【Java】java23种设计模式案例之命令模式

命令模式定义参考

例子: 源代码

3种案例

1.Command案例
问题描述:一个指挥官请求(命令)三连偷袭敌人
代码

package com.lagoon.command;

/** * 问题描述:一个指挥官请求(命令)三连偷袭敌人 * 这个类扮演的是接收者角色 */
public class CompanyArmy {

    public void sneakAttack(){
        System.out.println("我们知道如何偷袭敌人,保证完成任务!");
    }
}

package com.lagoon.command;

/** * 这个接口扮演的是命令接口角色 */
public interface Command {
    public abstract void execute();
}

package com.lagoon.command;

/** * 这个类扮演的是具体命令的角色 */
public class ConcreteCommand implements Command{

    CompanyArmy companyArmy;  //含有接收者的引用
    ConcreteCommand(CompanyArmy companyArmy){
        this.companyArmy=companyArmy;
    }

    @Override
    public void execute() {  //封装着指挥官的请求
        companyArmy.sneakAttack();  //偷袭敌人

    }
}

package com.lagoon.command;

/** * 这个类代表请求者,也就是指挥官的角色 */
public class ArmySuperior {

    Command command;  //用来存放具体命令的引用
    public void setCommand(Command command){
        this.command=command;
    }
    public void startExecuteCommand(){
        command.execute();
    }
}

package com.lagoon.command;

/** * 该类为main方法,演示一个指挥官下发命令如何请求三连偷袭敌人 */
public class Application {
    public static void main(String[] args) {
        //创建接收者
        CompanyArmy 三连=new CompanyArmy();
        //创建具体命令并指定接收者
        Command command=new ConcreteCommand(三连);
        //创建请求者
        ArmySuperior 指挥官=new ArmySuperior();
        //下发命令
        指挥官.setCommand(command);
        //开始执行命令
        指挥官.startExecuteCommand();
        //执行结果:输出语句,我们知道如何偷袭敌人,保证完成任务!
    }
}

2.Dir命令,演示命令模式的可撤销操作
问题描述:该问题描述的是请求者请求在硬盘上建立目录,还可以撤销请求,这就要求接收者不仅可以在硬盘上建立目录,也可以删除上一次请求所建立的目录
代码:

package com.lagoon.Dir;

/** * 该问题描述的是请求者请求在硬盘上建立目录,还可以撤销请求,这就要求接收者不仅可以在硬盘上建立目录,也可以删除上一次请求所建立的目录 * 该类扮演的是接收者角色,即既可以新增目录,也可以删除目录 */
import java.io.*;
public class MakeDir {
    public void createDir(String name){
        File dir=new File(name);
        dir.mkdir();
    }

    public void deleteDir(String name){
        File dir=new File(name);
        dir.delete();
    }
}

package com.lagoon.Dir;

/** * 该类为命令接口类,代表既可以执行命令,也可以撤销收回命令 */
public interface Command {
    public abstract void execute(String name);
    public abstract void undo();
}

package com.lagoon.Dir;

import java.util.ArrayList;

/** *该类为具体命令类 */
public class ConcreteCommand implements Command{
    ArrayList<String> dirNameList;
    MakeDir makeDir;
    ConcreteCommand(MakeDir makeDir){
        dirNameList=new ArrayList<String>();
        this.makeDir=makeDir;
    }
    @Override
    public void execute(String name) {
        makeDir.createDir(name);
        dirNameList.add(name);

    }

    @Override
    public void undo() {
        if (dirNameList.size()>0){
            int m=dirNameList.size();
            String str=dirNameList.get(m-1);
            makeDir.deleteDir(str);
            dirNameList.remove(m-1);
        }
        else
            System.out.println("没有需要撤销的操作");

    }
}

package com.lagoon.Dir;

/** * 该类为请求者角色 */
public class RequestMakeDir {
    Command command;
    public void setCommand(Command command){
        this.command=command;
    }
    public void startExecuteCommand(String name){
        command.execute(name);
    }
    public void undoCommand(){
        command.undo();
    }
}

package com.lagoon.Dir;

import java.util.Iterator;

/** * 该类为发射类 */
public class Application {
    public static void main(String[] args) {
        //创建接收者
        MakeDir makeDir=new MakeDir();
        //创建具体命令并指定接收者
        Command command=new ConcreteCommand(makeDir);
        RequestMakeDir requestMakeDir=new RequestMakeDir();
        requestMakeDir.setCommand(command);
        //建立名字是java的目录
        requestMakeDir.startExecuteCommand("java");
        //建立名字是c的目录
        requestMakeDir.startExecuteCommand("c");
        //建立名字是c++的目录
        requestMakeDir.startExecuteCommand("c++");
        //撤销命令,删除名字是c++的目录
        requestMakeDir.undoCommand();
        //撤销命令,删除名字是c的目录
        requestMakeDir.undoCommand();

        //查看当前列表里的目录
        Iterator<String> iterator = ((ConcreteCommand) command).dirNameList.iterator();
        if (iterator.hasNext()){
            System.out.println(iterator.next());
        }

        //运行结果,输出一个列表目录,java,说明其他被撤销成功
    }
}

3.Letter案例
问题描述:请求者可以请求只输出英文字母表,俄文字母表或1-n之间的偶数
也可以请求三种都输出
代码:

package com.lagoon.Letter;

/** * 该文件夹演示宏命令 * 宏命令也是一个具体命令,只不过他包含了其他命令的引用 * 执行一个宏命令,相当于执行了许多的具体命令 * 该类为接收者角色 * 问题描述:请求者可以请求只输出英文字母表,俄文字母表或1-n之间的偶数 * 也可以请求三种都输出 */
public class PrintLetter {
    public void printEnglish(){
        for (char c='a';c<='z';c++){
            System.out.println(" "+c);
        }
    }

    public void printRussian(){
        for (char c='а';c<='я';c++){
            System.out.println(" "+c);
        }
    }
}

package com.lagoon.Letter;

/** * 命令接口类 */
public interface Command {
    public abstract void execute();
}

package com.lagoon.Letter;

//具体命令之输出英文字母表命令
public class PrintEnglishCommand implements Command{
    PrintLetter letter;

    public PrintEnglishCommand(PrintLetter letter) {
        this.letter = letter;
    }
    public void execute(){
        letter.printEnglish();
    }
}

package com.lagoon.Letter;

//具体命令之输出俄文字母表
public class PrintRussianCommand implements Command{
    PrintLetter letter;

    public PrintRussianCommand(PrintLetter letter) {
        this.letter = letter;
    }

    @Override
    public void execute() {
        letter.printRussian();
    }

}

package com.lagoon.Letter;

import java.util.ArrayList;

//宏命令,执行所有命令
public class MacroCommand implements Command{

    ArrayList<Command> commandArrayList;  //把所有的命令存进数组

    public MacroCommand(ArrayList<Command> commandArrayList) {
        this.commandArrayList = commandArrayList;
    }

    @Override
    public void execute() {
        for (int k=0;k<commandArrayList.size();k++){
            Command command=commandArrayList.get(k);  //循环定位到命令
            command.execute(); //执行命令
        }
    }
}

package com.lagoon.Letter;

//该类为请求者角色
public class RequestMakedir {
    Command command;

    public void setCommand(Command command) {
        this.command = command;
    }
    public void startExecuteCommand(){
        command.execute();
    }
}

package com.lagoon.Letter;

import java.util.ArrayList;

//发射类,main方法
public class Application {
    public static void main(String[] args) {
        ArrayList<Command> list= new ArrayList<>();
        //创建请求者
        RequestMakedir requestMakedir=new RequestMakedir();
        //创建命令具体接收者
        Command command1=new PrintEnglishCommand(new PrintLetter());
        Command command2=new PrintRussianCommand(new PrintLetter());

        //整合命令
        list.add(command1);
        list.add(command2);


        //创宏命令
        Command macroCommand=new MacroCommand(list);

        System.out.println("单独输出英文字母表:");
        requestMakedir.setCommand(command1);
        requestMakedir.startExecuteCommand();

        System.out.printf("%n用一个宏命令输出所有:%n");
        requestMakedir.setCommand(macroCommand);
        requestMakedir.startExecuteCommand();
    }
}

全部评论

相关推荐

无感c:春招不是早就结束了吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务