设计模式—行为型模式之命令模式

设计模式---行为型模式之命令模式

命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

命令模式包含以下主要角色。

  • 抽象命令类(Command)角色:声明执行命令的接口,拥有执行命令的抽象方法 execute()。
  • 具体命令类(Concrete Command)角色:是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。
  • 实现者/接收者(Receiver)角色:执行命令功能的相关操作,是具体命令对象业务的真正实现者。
  • 调用者/请求者(Invoker)角色:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。

示例

实际上,我们日常开发过程中mvc三层开发,就是一种命令模式的实现。

我们看一个其他的例子。

宠物狗的主人可以让宠物吃饭,玩耍。

命令接口类如下:

java 复制代码
public interface Command {
    /**
     * 命令的执行方法
     */
    void execute();
}

命令执行者如下:

java 复制代码
/**
 * 命令接收者
 */
public class Dog {
    public void eat(){
        System.out.println("小狗吃饭");
    }
    
    public void play(){
        System.out.println("小狗玩耍");
    }
}

吃饭命令类如下:

java 复制代码
/**
 * 吃饭命令类
 */
public class EatCommand implements Command{
    private Dog dog;

    public EatCommand(Dog dog) {
        this.dog = dog;
    }

    @Override
    public void execute() {
        dog.eat();
    }
}

玩耍命令类如下:

java 复制代码
/**
 * 玩耍命令类
 */
public class PlayCommand implements Command{
    private Dog dog;

    public PlayCommand(Dog dog) {
        this.dog = dog;
    }

    @Override
    public void execute() {
        dog.play();
    }
}

命令发起者如下:

java 复制代码
/**
 * 命令发起者
 */
public class Human {
    private Command command;

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

    public void call(){
        command.execute();
    }

}

测试类如下:

java 复制代码
public class CommandTest {
    public static void main(String[] args) {
        Dog dog = new Dog();
        EatCommand eatCommand = new EatCommand(dog);
        PlayCommand playCommand = new PlayCommand(dog);

        Human human = new Human();
        human.setCommand(eatCommand);
        human.call();

        human.setCommand(playCommand);
        human.call();
    }
}

运行结果如下:

相关推荐
__万波__12 小时前
二十三种设计模式(二)--工厂方法模式
java·设计模式·工厂方法模式
前端老宋Running14 小时前
React 的“时光胶囊”:useRef 才是那个打破“闭包陷阱”的救世主
前端·react.js·设计模式
Tzarevich15 小时前
从字面量到原型链:JavaScript 面向对象的完整进化史
javascript·设计模式
繁华似锦respect19 小时前
C++ 设计模式之工厂模式详细介绍
java·linux·c++·网络协议·设计模式
想要成为祖国的花朵19 小时前
基于多设计模式的抽奖系统__测试报告
java·selenium·测试工具·jmeter·设计模式·测试用例·安全性测试
重铸码农荣光21 小时前
JavaScript 面向对象编程:从字面量到原型继承的深度探索
前端·javascript·设计模式
L***d6701 天前
Spring Boot 经典九设计模式全览
java·spring boot·设计模式
未可知7771 天前
软件设计师(下午题2)、UML与设计模式
算法·设计模式·职场和发展·uml
繁华似锦respect1 天前
C++ 设计模式之单例模式详细介绍
服务器·开发语言·c++·windows·visualstudio·单例模式·设计模式
xunyan62341 天前
面向对象(下)-设计模式与单例设计模式
java·单例模式·设计模式