zoukankan      html  css  js  c++  java
  • 设计模式学习笔记之命令模式

    什么是设计模式?

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

    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开发,越学习越感觉知识太多,自身了解太少,只能不断追寻
  • 相关阅读:
    01 《i》控制字体大小 v-for循环绑定类名 v-bind 结合三目运算 动态添加类
    右侧是长方形和半圆结合 光标放上去在规定时间内完成动画
    04-align-content 它对于当单行是没有效果的
    03-flex-wrap是否换行
    02-align-items的用法
    01--顶部的通告特效---仅显示一条一条滚动
    洛谷P2392 kkksc03考前临时抱佛脚(01背包/搜索)
    蓝桥杯 9大臣的旅费(树的直径)
    蓝桥杯 8买不到的数目(数论/线性DP)
    蓝桥杯 7连号区间数(暴力or并查集(?)
  • 原文地址:https://www.cnblogs.com/fengtingxin/p/9892718.html
Copyright © 2011-2022 走看看