命令模式,及与策略模式的区别

本文介绍了软件设计中的命令模式,包括其核心概念、应用场景及与其他模式如策略模式的区别。通过实例展示了命令模式如何解耦请求方与接收方,实现操作的封装。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

命令模式:对命令的封装,每一个命令都是一个操作,请求方发出请求,接收方接收请求,并执行操作。命令模式解耦了请求方和接收方,命令模式属于行为型模式

命令模式与策略模式的区别:

策略模式的意图是封装算法,它认为“算法”已经是一个完整的、不可拆分的原子业务,即其意图是让这些算法独立,并且可以相互替换,让行为的变化独立于拥有行为的客户。例如从北京到南京可以坐飞机、高铁、火车。方式不同但结果一样。

命令模式则是对动作的解耦,把一个动作的执行分为执行对象(接收者角色)、执行行为(命令角色),让两者相互独立而不相互影响。

命令模式中的4个角色:

  1. 接收者角色(Receiver):负责具体执行一个请求
  2. 命令角色(ICommand):定义需要执行的所有命令行为
  3. 具体的命令角色(ConcreteCommand):内部维护一个Receiver
  4. 请求者角色(Invoker):接收客户端的命令,并执行命令

图片解析:

command:命令接口

openCommand、changeCommand、closeCommand:具体的命令

TV:命令接收者

Control:请求者角色

创建具体的命令对象(openCommand),构造器注入TV对象

请求者角色Control构造器注入具体的命令角色(openCommand)

/**
 * 功能:操作命令
 */
public interface Command {

    void execute();
}

/**
 * 功能:打开电视机
 */
public class OpenCommand implements Command{
    private TV tv = new TV();

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

/**
 * 功能:换台
 */
public class ChangeCommand implements Command{
    private TV tv = new TV();

    @Override
    public void execute() {
        tv.change();
    }
}

/**
 * 功能:关闭电视机
 */
public class CloseCommand implements Command{
    private TV tv = new TV();
    @Override
    public void execute() {
        tv.close();
    }
}

package com.kangping.command.lizi;

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

/**
 * 功能:遥控器
 */
public class Control {

    public List<Command> commands = new ArrayList<>();

    public Control(Command command) {
        commands.add(command);
    }

    public Control(List<Command> commands) {
        this.commands.addAll(commands);
    }

    public void action() {
        commands.forEach(e -> e.execute());
    }
}

/**
 * 功能:电视机
 */
public class TV {
    public void open() {
        System.out.println("打开电视机");
    }
    public void change() {
        System.out.println("切换电视机");
    }
    public void close() {
        System.out.println("关闭电视机");
    }
}

/**
 * 功能:
 */
public class Tests {

    public static void main(String[] args) {
        Command command = new OpenCommand();
        Command changeCommand = new ChangeCommand();
        Command closeCommand = new CloseCommand();
        List list = new ArrayList<>();
        list.add(command);
        list.add(changeCommand);
        list.add(closeCommand);
        Control control = new Control(list);
        control.action();
    }
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

睿智的小薛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值