您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

java设计模式——命令模式

小志的博客 发布时间:2021-01-23 20:51:21 ,浏览量:0

目录
    • 一、命令模式的定义与类型
    • 二、命令模式的适用场景
    • 三、命令模式的优点
    • 四、命令模式的缺点
    • 五、命令模式相关设计模式
    • 六、命令模式示例

一、命令模式的定义与类型

1、定义

  • 将"请求"封装成对象,以便使用不同的请求
  • 命令模式解决了应用程序中对象的职责以及他们之间的通信方式

2、类型

  • 行为型
二、命令模式的适用场景
  • 请求的调用者和请求接收者需要解耦,使得调用者和接收者不直接交互
  • 需要抽象出等待执行的行为
三、命令模式的优点
  • 降低耦合
  • 容易扩展新命令或者一组命令
四、命令模式的缺点
  • 命令的无限扩展会增加类的数量,提高系统实现复杂度
五、命令模式相关设计模式
  • 命令模式和备忘录模式
六、命令模式示例

以网站上课程视频的开放和关闭为例进行代码演示

1、代码结构如下: 在这里插入图片描述

2、定义一个命令接口类

package com.rf.designPatterns.behavioral.command;

/**
 * @description: 定义一个命令接口类
 * @author: xz
 */
public interface Command {

    //执行命令的方法
    void excute();
}

3、定义一个课程视频类

package com.rf.designPatterns.behavioral.command;

/**
 * @description: 定义一个课程视频类
 * @author: xz
 */
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+"课程视频关闭");
    }
}

4、定义一个开启课程视频命令类

package com.rf.designPatterns.behavioral.command;

/**
 * @description: 定义一个开启课程视频命令类
 * @author: xz
 */
public class OpenCourseVideoCommand implements Command{
    //通过构造器注入
    private CourseVideo courseVideo;
    public OpenCourseVideoCommand(CourseVideo courseVideo) {
        this.courseVideo = courseVideo;
    }

    //重写excute方法
    @Override
    public void excute() {
        courseVideo.open();
    }
}

5、定义一个关闭视频课程命令类

package com.rf.designPatterns.behavioral.command;

/**
 * @description: 定义一个关闭视频课程命令类
 * @author: xz
 */
public class CloseCourseVideoCommand implements Command{
    //通过构造器注入
    private CourseVideo courseVideo;
    public CloseCourseVideoCommand(CourseVideo courseVideo) {
        this.courseVideo = courseVideo;
    }
    //重写excute方法
    @Override
    public void excute() {
        courseVideo.close();
    }
}

6、定义一个人员类,执行命令

package com.rf.designPatterns.behavioral.command;

import java.util.ArrayList;
import java.util.List;

/**
 * @description: 定义一个人员类,执行命令
 * @author: xz
 */
public class Person {
    private List list=new ArrayList();

    //添加命令方法
    public void addCommand(Command command){
        list.add(command);
    }

    //执行命令方法
    public void executeCommand(){
        //遍历执行命令方法
        for(Command command: list ){
            command.excute();
        }
        //执行完命令后清空命令
        list.clear();
    }
}

7、定义一个命令模式的测试类

package com.rf.designPatterns.behavioral.command;

/**
 * @description: 定义一个命令模式的测试类
 * @author: xz
 */
public class Test {
    public static void main(String[] args) {
        //创建课程视频
        CourseVideo courseVideo = new CourseVideo("java设计模式");
        //创建开启课程视频命令
        OpenCourseVideoCommand openCourseVideoCommand = new OpenCourseVideoCommand(courseVideo);
        //创建关闭课程视频命令
        CloseCourseVideoCommand closeCourseVideoCommand = new CloseCourseVideoCommand(courseVideo);


        Person person = new Person();
        //接收到2条命令
        person.addCommand(openCourseVideoCommand);
        person.addCommand(closeCourseVideoCommand);
        //具体执行命令
        person.executeCommand();

    }
}

8、运行测试类,效果如下图: 在这里插入图片描述 9、UML类图如下: 在这里插入图片描述

关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0390s