美文网首页
《读_Head_First_有感》_“命令模式”

《读_Head_First_有感》_“命令模式”

作者: tjhuey | 来源:发表于2018-08-21 15:50 被阅读34次

    前言:
    前沿技术一直在迭代,有一种东西是不会更新的,那就是设计模式的思想。 可以来学习学习设计模式的思维,巧妙设计!
    使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能,quartz最经典!

    [TOC]

    1.官方话语

    概述

    设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。

    六大原则:

    单一职责原则 (Single ResponsiBility Principle) 概括:应该有且仅有一个原因引起类的变更
    里氏替换原则(liskov Substitution Principle ) 概括:基类出现的地方,子类一定可以出现
    依赖倒转原则(Depndece Inversion Principle) 概括:针对接口编程,依赖于抽象而不是具体
    接口隔离原则(Interface Segregation Principle) 概括:使用多个隔离的接口,比使用单个接口好 (细分接口,降低耦合)
    迪米特法则 (Demeter Principle) 概括:实体应当尽量少的与其他类发生互相作用,使得系统功能模块相对独立
    开闭原则(Open Close Principle) 概括: 对扩展开放,对修改关闭
    合成复用原则 (Composite Reuse Principle) 概括:尽量使用合成/聚合的方式,少用继承

    个人话语

    概述

    设计模式在代码层级中,是让你在某种业务场景刚开始设计时,能让未来的相关需求扩展极为方便的一个思想。
    简单的说,在一开始设计好,扩展是很方便的,设计模式就是这个功劳者
    对于我们本来就懒的开发人员来说,这是求之不得的。

    六大原则

    而对于六大原则,简单过一下就行,不用刻意理解,如果你会了面向对象和设计模式的使用,自然就遵循了。

    今日主题

    命令模式: 将请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提命令的撤销和恢复功能

    场景:

    认为是命令的地方就可以采用命令模式,例如,在GUI开发中,一个按钮的点击是一个命令,可以采用命令模式;模拟DOS命令的时候,当然也要采用命令模式;触发-反馈机制的处理等。等。

    概述:

    代码如下

    '命令全部'代码

    package top.huey.designpattern.command;
    
    /**
     * @author huey
     * @Description : 命令接口
     * @Date Created in 2018/8/21 14:36
     */
    public interface Command {
        /**
         * @author huey
         * @Description : 接受者具体执行 联想到了quartz中的execute
         * @Date Created in 2018/8/21 14:37
         */
        public void execute();
    
        /**
         * @author huey
         * @Description : 撤销命令
         * @Date Created in 2018/8/21 14:44
         */
        public void undo();
    }
    
    package top.huey.designpattern.command;
    
    /**
     * @author huey
     * @Description : 空命令什么也不做
     * @Date Created in 2018/8/21 15:07
     */
    public class NoCommand implements Command {
        /**
         * @author huey
         * @Description : 接受者具体执行 联想到了quartz中的execute
         * @Date Created in 2018/8/21 14:37
         */
        @Override
        public void execute() {
    
        }
    
        /**
         * @author huey
         * @Description : 撤销命令
         * @Date Created in 2018/8/21 14:44
         */
        @Override
        public void undo() {
    
        }
    }
    
    package top.huey.designpattern.command;
    
    /**
     * @author huey
     * @Description : 灯关命令
     * @Date Created in 2018/8/21 14:59
     */
    public class OffCommand implements Command {
    
        private Light light;
    
        public OffCommand(Light light) {
            this.light = light;
        }
    
        /**
         * @author huey
         * @Description : 接受者具体执行 联想到了quartz中的execute
         * @Date Created in 2018/8/21 14:37
         */
        @Override
        public void execute() {
            light.off();
        }
    
        /**
         * @author huey
         * @Description : 撤销命令
         * @Date Created in 2018/8/21 14:44
         */
        @Override
        public void undo() {
            light.on(); //反义 模拟
        }
    }
    
    package top.huey.designpattern.command;
    
    /**
     * @author huey
     * @Description : 灯开命令
     * @Date Created in 2018/8/21 14:59
     */
    public class OnCommand implements Command {
    
    
        private Light light;
    
    
        public OnCommand(Light light) {
            this.light = light;
        }
    
        /**
         * @author huey
         * @Description : 接受者具体执行 联想到了quartz中的execute
         * @Date Created in 2018/8/21 14:37
         */
        @Override
        public void execute() {
            light.on();
        }
    
        /**
         * @author huey
         * @Description : 撤销命令
         * @Date Created in 2018/8/21 14:44
         */
        @Override
        public void undo() {
            light.off();
        }
    }
    
    package top.huey.designpattern.command;
    
    /**
     * @author huey
     * @Description : 具体行为对象
     * @Date Created in 2018/8/21 14:47
     */
    public class Light {
    
        public void off(){
            System.out.println("light off");
        }
    
        public void on(){
            System.out.println("light on");
        }
    }
    
    package top.huey.designpattern.command;
    
    /**
     * @author huey
     * @Description : 间接调用命令的execute方法
     * @Date Created in 2018/8/21 14:58
     */
    public class RemoteCtrl {
    
        /**
         * 存储对象
         */
        private Command[] onCommands;
        private Command[] offCommands;
    
        Command undoCommand;//撤销补充
    
        /**
         * 设置容量
         */
        private static final int CAPACITY = 10;
    
        /**
         * 初始化
         */
        public RemoteCtrl() {
            onCommands = new Command[CAPACITY];
            offCommands = new Command[CAPACITY];
            NoCommand noCommand = new NoCommand();
            for (int i = 0; i < CAPACITY; i++) {
                onCommands[i] = noCommand;
                offCommands[i] = noCommand;
            }
            undoCommand = new NoCommand();////开始无撤销
        }
    
        /**
         * 在哪个位置,设置什么命令  //宏观看一个off可以替换成list 多个off执行
         */
        public void setCommands(int index, OffCommand offCommand, OnCommand onCommand) {
            offCommands[index] = offCommand;
            onCommands[index] = onCommand;
        }
    
        /**
         * 执行索引出某个on命令
         */
        public void onButtonCommand(int index) {
            onCommands[index].execute();
            undoCommand = onCommands[index];//记录上次命令
        }
    
        /**
         * 执行索引出某个off命令
         */
        public void offButtonCommand(int index) {
            offCommands[index].execute();
            undoCommand = offCommands[index]; //记录上次命令
        }
    
        public void undoButtonCommand() {
            undoCommand.undo();
        }
    }
    
    package top.huey.designpattern.command;
    
    import org.junit.Test;
    
    /**
     * @author huey
     * @Description : invoker 身份
     * @Date Created in 2018/8/21 14:36
     */
    public class CommandInvokerTest {
    
        @Test
        public void testInvoker() {
            Light light = new Light();
    
            //组合对象
            OffCommand offCommand = new OffCommand(light);
            OnCommand onCommand = new OnCommand(light);
    
            //组合对象
            RemoteCtrl remoteCtrl = new RemoteCtrl();
            remoteCtrl.setCommands(1, offCommand, onCommand);
    
            remoteCtrl.offButtonCommand(0);
            remoteCtrl.onButtonCommand(0);
    
            remoteCtrl.offButtonCommand(1);
            remoteCtrl.onButtonCommand(1);
    
            //撤销上一次
            remoteCtrl.undoButtonCommand();
        }
    }
    
    
    读者须知:

    1.本系列文章内容会比较简陋,望有兴趣读者还是fork源码,调试一下。(如果你看过该书,一定可以加深印象)
    2.联想下实际运用的哪些业务场景用到该模式,哪些中间件用到该模式,是否自己能在业务中使用。
    3.即使你现在用不到某些设计模式,但是还是应该理解其原理的。
    4.当时理解并不意味着自己已会,可以自己尝试练习,并幻想一种业务场景,画画类图,设计一下。


    coding 时,做到了如何落实;
    writing时,做到了如何表达;
    sharing时,做到了如何传授;
    thinking时,做到了如何提升;

    代码请参考码云:https://gitee.com/tjhuey/CodingGroup
    设计模式相关概念请参考:http://naotu.baidu.com/file/5811bf42020e6a2d877b992cfca90d26

    进度

    • [x] 策略模式,<span style="color: #43A047; ">已完成</span>
    • [x] 观察者模式,<span style="color: #43A047; ">已完成</span>;
    • [x] 装饰者模式,<span style="color: #43A047; ">已完成</span>;
    • [x] 工厂方法模式,<span style="color: #43A047; ">已完成</span>;
    • [x] 抽象工厂模式,<span style="color: #43A047; ">已完成</span>;
    • [x] 单例模式,<span style="color: #43A047; ">已完成</span>;
    • [x] 命令模式,<span style="color: #43A047; ">已完成</span>;
    • [ ] ..,<span style="color: #F44336; ">未完成</span>;

    相关文章

      网友评论

          本文标题:《读_Head_First_有感》_“命令模式”

          本文链接:https://www.haomeiwen.com/subject/lvrjiftx.html