设计模式入门:命令模式

个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片
文章中部分定义和解释性文字,都是引用百度百科,主要的代码及场景应用为本人原创

命令模式尝试以物件来代表实际行动。“行为请求者”与“行为实现者”通常呈现一种“紧耦合”,命令模式将一组行为抽象为对象,实现二者之间的松耦合

场景:系统的中有多个任务,都有开关功能,而且系统中任务的数量类型都不固定,要求控制所有任务开关的这个控制器,有比较好的扩展性。所以使用命令模式,就可以比较好的解决这个问题

结构

  • Command:定义命令的接口,声明执行的方法。(Command)
  • ConcreteCommand:命令接口实现对象,是“虚”的实现;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。(TaskStartCommand,TaskStopCommand)
  • Receiver:接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。(抽象接受者:Task,具体接受者:CleanTask,StatisticsTask)
  • Invoker:通常会持有命令对象,这个是客户端真正触发命令并要求命令执行相应操作的地方,相当于使用命令对象的入口。(Control)

设计

这里写图片描述

实现

代码地址:https://github.com/telundusiji/designpattern

接受者 抽象任务

@Data
public abstract class Task {
    private String status;
    public abstract void start();
    public abstract void  stop();
}

接受者 具体任务 清理任务

@Slf4j
public class CleanTask extends Task{
    @Override
    public void start() {
        setStatus("UP");
        log.info("CleanTask is working...");
    }

    @Override
    public void stop() {
        log.info("CleanTask is shutdown!");
        setStatus("DOWN");
    }

}

接受者 具体任务 统计任务

@Slf4j
public class StatisticsTask extends Task {
    @Override
    public void start() {
        setStatus("UP");
        log.info("StatisticsTask is working...");
    }

    @Override
    public void stop() {
        log.info("StatisticsTask is shutdown!");
        setStatus("DOWN");
    }
}

抽象命令

public abstract class Command {
    public abstract void execute();
}

具体命令 任务开始命令

public class TaskStartCommand extends Command {
    private Task task;

    public TaskStartCommand(Task task) {
        this.task = task;
    }

    @Override
    public void execute() {
        task.start();
    }
}

具体命令 任务停止命令

public class TaskStopCommand extends Command {
    private Task task;

    public TaskStopCommand(Task task) {
        this.task = task;
    }

    @Override
    public void execute() {
        task.stop();
    }
}

命令入口

public class Control {
    private Command command;

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

    public void action() {
        if(command==null){
            return;
        }
        this.command.execute();
    }
}

优缺点

优点:

  • 降低对象之间的耦合度。
  • 新的命令可以很容易地加入到系统中。
  • 可以比较容易地设计一个组合命令。

缺点:

  • 命令类型太多就会导致命令类膨胀,所以使用该模式之前要经过全面思考,避免命令类太多膨胀,不便维护

个人公众号【爱做梦的锤子】,全网同id,个站 http://te-amo.site,欢迎关注,里面会分享更多有用知识,还有我的私密照片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值