设计模式学习笔记之命令模式

什么是设计模式?

        设计模式是一套代码前辈们的开发经验,踩坑然后分类的总结(个人理解)。下面是设计模式的一些原则:(主要目的还是为了提升代码的复用性,使系统变得稳定)

  1. “开-闭”原则:一个软件实体应当对扩展开放,对修改关闭。抽象化是关键
  2. 里氏代换原则:它说:任何基类可以出现的地方,子类一定可以出现。
  3.  依赖倒转原则:要依赖于抽象,不依赖于实现
  4. 合成/聚合复用原则:要尽量使用聚合/合成,而不是通过继承关系达到复用的目的
  5. 迪米特法则:一个软件实体应当于尽可能少的其他实体发生相互作用。
  6. 接口隔离原则:应当为客户端提供尽可能小的单独的接口,而不是提供大的总接口。

这些设计原则首先都是复用的原则,遵循这些设计原则可以有效的提升系统的复用性,同时提高系统的可维护性。

这里我们要首先对设计模式中的命令模式进行了一些理解和demo的编写,来保证读者和笔者的正常理解。

从下图而言,该图就是诠释了什么是面向对象的编程方式,

首先我们是从执行者的角度出发,从这里我们只观察到我们的请求是什么,然后是什么来接受它,其实就我感觉,我们其实也不需要关心是谁来接收这个命令,只需要发出去命令就好了(这个暂且不论,我们还是要已这个类图来写程序的)。

按部就班的,我们还是要来一个demo:

代码结构:

                   

首先是厨师的接收者(CookReceiver实现了 Receiver 的action方法):

public class CookReceiver implements Receiver {

    public CookReceiver() {
        System.out.println("创建厨师信息接收者...");
    }

    public void action() {
        System.out.println("我是厨师!我来炒菜!");
    }
}
View Code

下一步,就该创建命令了(OrderCommand实现了 Command 的execute):

/**
 * 下单命令
 */
public class OrderCommand implements Command {

    private Receiver receiver = null;

    public OrderCommand() {
        System.out.println("创建下单命令");
    }

    public OrderCommand(Receiver receiver){
        this.receiver = receiver;
    }

    /**
     * 执行命令
     */
    public void execute() {
        System.out.println("命令执行...");
        receiver.action();
    }


    public Receiver getReceiver() {
        return receiver;
    }
}
View Code

在《HeadFirst 设计模式》中,创建命令的时候需要把该命令的接收者也要传递进去。

再下一步,就是创建请求者(ClerkInvoker实现了 Invoker 的call):

/**
 * 接待员请求者
 */
public class ClerkInvoker implements Invoker {

    private Command command;

    public ClerkInvoker() {
        System.out.println("创建接待员请求者");
    }

    public ClerkInvoker(Command command) {
        this.command = command;
    }

    public void call() {
        System.out.println("请求执行...");
        command.execute();
    }

    public Command getCommand() {
        return command;
    }
}
View Code

再下面就是main方法执行了

public static void main(String[] args) {
        //指定接收者为厨师
        Receiver receiver = new CookReceiver();

        //命令为下单命令
        Command command = new OrderCommand(receiver);

        //传递者为接待员
        Invoker clerkInvoker = new ClerkInvoker(command);

        //接待员大叫一声,菜来了
        clerkInvoker.call();

    }
View Code

总结:

  1. 感觉这个模式跟我目前的工作场景(网站开发)不太符合,它的目的很明确,就是让命令的请求一方不知道命令到底是如何执行的,但是我认为现在已经有接口了,我们去调用某一个接口,我们也是不清楚接口中的业务逻辑的
  2. 个人感觉这个模式有一些死板。

参考文档:

https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/creational.html

《head First设计模式》

《Java与模式》

一个入行不久的Java开发,越学习越感觉知识太多,自身了解太少,只能不断追寻
原文地址:https://www.cnblogs.com/fengtingxin/p/9892718.html