work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

命令模式

Posted on 2019-03-02 13:25  work hard work smart  阅读(146)  评论(0编辑  收藏  举报

一、定义

将“请求”封装成对象,以便使用不同的请求

命令模式解决了应用程序中对象的职责以及它们之间的通信方式。(发送者和接收者完全解耦)

类型:行为型

 

二、适用场景

1、请求调用者和请求接收者需要解耦,使得调用者和接收者不直接交互。

2、需要抽象出等待执行的行为

 

三、优点

1、降低耦合

2、容易扩展新命令或者一组命令

 

四、缺点

1、命令的无限扩展会增加类的数量,提高系统实现复杂度

 

五、命令模式-相关设计模式

1、命令模式和备忘录模式

两者可以结合起来,例如备忘录模式可以保存命令的历史记录。

 

六、Coding

 场景:通过命令关闭课程某一部分或者某一小节

 1、Command 接口

public interface Command {
    void execute();
}

  

2、CourseVideo 类

public class CourseVideo {

    private String name;

    public CourseVideo(String name) {
        this.name = name;
    }

    public void open(){
        System.out.println(this.name +"课程视频开发");
    }

    public void close(){
        System.out.println(this.name +"课程视频关闭");
    }
}

  

3、OpenCourseVideoComand 打开课程权限为免费命令

public class OpenCourseVideoComand implements  Command{

    private CourseVideo courseVideo;

    public OpenCourseVideoComand(CourseVideo courseVideo) {
        this.courseVideo = courseVideo;
    }

    @Override
    public void execute() {
        this.courseVideo.open();
    }
}

  

4、CloseCourseVideoCommand 关闭课程权限为免费命令

public class CloseCourseVideoCommand implements  Command{

    public CourseVideo courseVideo;

    public CloseCourseVideoCommand(CourseVideo courseVideo) {
        this.courseVideo = courseVideo;
    }

    @Override
    public void execute() {
        this.courseVideo.close();
    }
}

  

5、员工类

/**
 * 员工类
 */
public class Staff {
    private List<Command> commandList = new ArrayList<>();
    public void addCommand(Command command){
        commandList.add(command);
    }

    public void executeCommands(){
        for(Command command: commandList){
            command.execute();
        }
        commandList.clear();
    }
}

  

 

6、UML图

 

7、测试

public class Test {
    public static void main(String[] args) {
        CourseVideo courseVideo = new CourseVideo("Java设计模式");
        OpenCourseVideoComand openCourseVideoComand = new OpenCourseVideoComand(courseVideo);
        CloseCourseVideoCommand closeCourseVideoCommand = new CloseCourseVideoCommand(courseVideo);

        Staff staff = new Staff();
        //老板下命令:开发视频课程
        staff.addCommand(openCourseVideoComand);
        //老板下命令:关闭视频课程
        staff.addCommand(closeCourseVideoCommand);
        staff.executeCommands();

    }
}

  结果:

Java设计模式课程视频开放
Java设计模式课程视频关闭

  

八、命令模式在源码中的应用

1、Runnable 

可以理解为抽象的命令

 

 Runnable的实现,可以理解为具体实现的命令。

 

2、junit.framework下的Test接口

run方法,可以理解为命令模式的execute方法。