设计模式9之命令模式

在开发中,方法的请求与方法的执行往往存在紧密耦合关系,不利于系统的维护。命令模式就是为了解决这个问题而出现的。

什么是命令模式

命令模式是一个高内聚的模式,其定义为:Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.(将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。)

下面为命令模式的通用类图:

命令模式

命令模式主要由3个要素组成:

  • Receive接收者:接收命令

  • Command命令角色:封装要执行的命令

  • Invoker调用者:执行命令

代码实现

首先创建一个抽象接收者Receiver

public abstract class Receiver {
    //抽象接收者,定义每个接收者都必须完成的业务
    public abstract void doSomething();
}

再创建一个Receiver的实现类ConcreteReceiver1。实现类可以有多个,如还可以创建ConcreteReceiver2

扫描二维码关注公众号,回复: 12004625 查看本文章
public class ConcreteReceiver1 extends Receiver {
    @Override
    public void doSomething() {
        Console.log("执行ConcreteReceiver1的方法...");
    }
}

public class ConcreteReceiver2 extends Receiver {
    @Override
    public void doSomething() {
        Console.log("执行ConcreteReceiver2的方法...");
    }
}

然后创建命令类抽象Command

public abstract class Command {
    //每个命令类都必须有一个执行命令的方法
    public abstract void execute();
}

Receiver一样,Command也可以有很多实现类。

public class ConcreteCommand1 extends Command {
    //对哪个Receiver类进行命令处理
    private Receiver receiver;

    //构造函数传递接收者
    public ConcreteCommand1(Receiver _receiver) {
        this.receiver = _receiver;
    }

    //必须实现一个命令
    @Override
    public void execute() {
        //业务处理
        this.receiver.doSomething();
    }
}
public class ConcreteCommand2 extends Command {
    //对哪个Receiver类进行命令处理
    private Receiver receiver;

    //构造函数传递接收者
    public ConcreteCommand2(Receiver _receiver) {
        this.receiver = _receiver;
    }

    //必须实现一个命令
    @Override
    public void execute() {
        //业务处理
        this.receiver.doSomething();
    }
}

创建调用者Invoker

public class Invoker {
    private Command command;

    //接受命令
    public void setCommand(Command _command) {
        this.command = _command;
    }

    //执行命令
    public void action() {
        this.command.execute();
    }
}

测试:

@Test
public void test() {
    //首先声明调用者Invoker
    Invoker invoker = new Invoker();
    //定义接收者
    Receiver receiver = new ConcreteReceiver1();
    //定义一个发送给接收者的命令
    Command command = new ConcreteCommand1(receiver);
    //把命令交给调用者去执行
    invoker.setCommand(command);
    invoker.action();
}

测试结果:

执行ConcreteReceiver1的方法...

这里Receiver里面的方法就是我们需要用的方法,这个方法由Command获取封装,Invoker去执行。

关于命令模式的思考

调用者不直接调用接收者的方法,而是去调用Commandexecute()。对于调用者来说,它不需要知道接收者是谁。

一般来说,命令模式结合其他设计模式,会有更好的效果。

但是命令模式中Command也不能无限扩展,如果有N个命令,那就会有N个Command子类,这样也不是很好。

往期推荐

扫码二维码,获取更多精彩。或微信搜Lvshen_9,可后台回复获取资料

1.回复"java" 获取java电子书;

2.回复"python"获取python电子书;

3.回复"算法"获取算法电子书;

4.回复"大数据"获取大数据电子书;

5.回复"spring"获取SpringBoot的学习视频。

6.回复"面试"获取一线大厂面试资料

7.回复"进阶之路"获取Java进阶之路的思维导图

8.回复"手册"获取阿里巴巴Java开发手册(嵩山终极版)

9.回复"总结"获取Java后端面试经验总结PDF版

10.回复"Redis"获取Redis命令手册,和Redis专项面试习题(PDF)

11.回复"并发导图"获取Java并发编程思维导图(xmind终极版)

另:点击【我的福利】有更多惊喜哦。

猜你喜欢

转载自blog.csdn.net/wujialv/article/details/109153859