java 设计模式_行为型_19命令模式

19.命令模式

首先就是我们的 Client 想要实现一个功能,于是它就创建了一个 Command, 为了方便调用将 Command 封装在了 Invoker 中,当我们想调用的时候,Invoker 会执行内部 Command 提供的方法, Receiver 接收到 Command 的请求,为其提供底部支持。

多说无益,我将通过一个例子介绍命令模式。

实例

目前大部分的软件都支持用户自定义界面,比如说我们可以修改字体大小,背景颜色等。我们就以此为例。首先,写出两个类。

java 复制代码
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Font {
    private String fontSize = "normal";
}
java 复制代码
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BackGround {
    private String bgColor = "default color";
}

这是 Command, 修改字体大小和背景的类都继承于此。

java 复制代码
public interface Command {
    void execute();
}

我们只是在类中获得一个 Font 类的引用,然后调用setFontSize() 方法对字体的大小进行设置。

java 复制代码
@Data
@NoArgsConstructor
@AllArgsConstructor
public class LargeFontCommand implements Command {


    private Font font;


    @Override
    public void execute() {
        font.setFontSize("large");
    }
}
java 复制代码
@AllArgsConstructor
@NoArgsConstructor
@Data
public class NormalFontCommand implements Command {
    private Font font;


    @Override
    public void execute() {
        font.setFontSize("Normal");
    }
}

background类的引用,调背景颜色

java 复制代码
@NoArgsConstructor
@AllArgsConstructor
@Data
public class CustomBackGround implements Command {


    private BackGround backGround;
    private String color;


    public CustomBackGround(BackGround backGround){
        this.backGround = backGround;
    }




    @Override
    public void execute() {
        backGround.setBgColor("Custom background");
    }
}
java 复制代码
@AllArgsConstructor
@NoArgsConstructor
@Data
public class DefaultBackground implements Command {


    private BackGround backGround;


    @Override
    public void execute() {
        backGround.setBgColor("default color");
    }
}

Invoker类存放命令

java 复制代码
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Invoker {


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


    public void setCommand(int i,Command command){
        commands.add(i,command);
    }
    public void update(int i){
        commands.get(i).execute();
    }
}
java 复制代码
public class CommandTest {
    public static void main(String[] args) {
        Font font = new Font();
        BackGround backGround = new BackGround();


        NormalFontCommand normalFontCommand = new NormalFontCommand(font);
        LargeFontCommand largeFontCommand = new LargeFontCommand(font);
        DefaultBackground defaultBackground = new DefaultBackground(backGround);
        CustomBackGround customBackGround = new CustomBackGround(backGround);


        Invoker invoker = new Invoker();
        invoker.setCommand(0,normalFontCommand);
        invoker.setCommand(1,largeFontCommand);
        invoker.setCommand(2,defaultBackground);
        invoker.setCommand(3,customBackGround);


        invoker.update(3);
        System.out.println(backGround.getBgColor());


    }
}

我们首先把所有的命令添加到了 Invoker , 然后直接调用 update() 方法就可以了。

这么做有什么好处呢?看的出来,可以将很多命令放进 Invoker , 它并不知道功能是如何实现的,它就像一个中介, Client 请求一个功能,它就将这个请求转给 Command 去实现。这种模式有很多的用途,比如说多功能遥控器,日志打印等。

还有一点不得不说的,我们可以使用宏命令,什么是宏命令呢?就是写一个 Command ,这个 Command 可以实现多个功能。比如说我们可以同时修改背景和颜色。

相关推荐
泡茶喝茶写代码9 分钟前
A股量化数据工程:从 REST 接口到策略信号(第 8 篇):成长能力因子:营收与利润增速
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口·股票数据api数据
\光辉岁月/1 小时前
7.javase-面向对象
java·开发语言
weixin_531094691 小时前
heap_4内存管理
java·开发语言·算法
程序员南飞1 小时前
win系统安装minio
java·数据结构·算法
Escalating_xu2 小时前
【Python】使用库:标准库、第三方库、pip、项目实战与程序打包
java·python·pip
Wang's Blog2 小时前
Java框架 SpringCloud 快速入门: 过滤器链执行顺序
java·spring cloud
geovindu2 小时前
rust: Abstract Factory pattern
开发语言·后端·设计模式·rust·抽象工厂模式
砚底藏山河2 小时前
量化实战:回测数据底座快照与版本管理进阶
java·大数据·python·金融·maven
Cc.Y3 小时前
Java零基础入门:封装与继承 —— 从“裸奔“到“穿衣服“,从“重复造轮子“到“站在巨人肩膀上“
java·开发语言
Escalating_xu3 小时前
【C 语言】深入理解指针(4):回调函数、qsort、void * 与泛型排序的模拟实现
java·c语言·开发语言