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

《读_Head_First_有感》_“状态模式”

作者: tjhuey | 来源:发表于2018-10-11 18:23 被阅读21次

    前言:
    前沿技术一直在迭代,有一种东西是不会更新的,那就是设计模式的思想。 可以来学习学习设计模式的思维,巧妙设计!
    外观模式就是整合多个对象到一个对象,对外暴露一个,常用接口简化!
    状态模式,根随业务的状态进行某种状态的业务操作,请看源代码

    [TOC]

    1.官方话语

    概述

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

    六大原则:

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

    个人话语

    概述

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

    六大原则

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

    今日主题

    状态模式:概述:当一个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类

    场景:

    概述:

    代码如下

    '状态模式'代码

    package com.huey.designpattern.statepattern;
    
    /**
    * ┏┓   ┏┓
    * ┏┛┻━━━┛┻┓
    * ┃       ┃  
    * ┃   ━   ┃
    * ┃ ┳┛ ┗┳ ┃
    * ┃       ┃
    * ┃   ┻   ┃
    * ┃       ┃
    * ┗━┓   ┏━┛
    * ┃   ┃ 神兽保佑        
    * ┃   ┃ 代码无BUG!
    * ┃   ┗━━━┓
    * ┃       ┣┓
    * ┃       ┏┛
    * ┗┓┓┏━┳┓┏┛
    * ┃┫┫ ┃┫┫
    * ┗┻┛ ┗┻┛
     * @author
     * @Description :  状态机
     * @Date Created in 2018/9/23 13:06
    */
    public interface State {
    
        /**
         * @author huey
         * @Description : 某状态的日志处理
         * @Date Created in 2018/9/23 13:08
         */
        void doLog();
    
        /**
         * @author huey
         * @Description : 某状态的插入处理
         * @Date Created in 2018/9/23 13:08
         */
        void doInsert();
    
        /**
         * @author huey
         * @Description : 某状态的计算处理
         * @Date Created in 2018/9/23 13:08
         */
        void doCalc();
    }
    package com.huey.designpattern.statepattern;
    
    import lombok.Getter;
    
    /**
     * @author huey
     * @Description : 状态枚举
     * @Date Created in 2018/9/23 13:13
     */
    
    @Getter
    public enum StateEnum {
    
        ONE_STATE(1, 1, "one desc"),
    
        TWO_STATE(2, 2, "two desc"),
    
        THREE_STATE(3, 3, "three desc"),;
    
        private int index;
        private int stateCode;
        private String desc;
    
        StateEnum(int index, int stateCode, String desc) {
            this.index = index;
            this.stateCode = stateCode;
            this.desc = desc;
        }
    
        /**
         * @author huey
         * @Description : 对外获取枚举对象
         * @Date Created in 2018/9/23 13:24
         */
        public static StateEnum getEnum(int stateCode) {
            for (StateEnum stateEnum : values()) {
                if (stateEnum.getStateCode() == stateCode) {
                    return stateEnum;
                }
            }
            return null;
        }
    }
    package com.huey.designpattern.statepattern;
    
    /**
     * @author huey
     * @Description : 状态业务实现
     * @Date Created in 2018/9/23 13:16
     */
    public class StateService implements State {
    
        private StateEnum stateEnum;
    
        public StateService(StateEnum stateEnum) {
            this.stateEnum = stateEnum;
        }
    
        /**
         * @author huey
         * @Description : 某状态的日志处理
         * @Date Created in 2018/9/23 13:08
         */
        @Override
        public void doLog() {
            switch (this.stateEnum) {
                case ONE_STATE:
                    System.out.println(StateEnum.ONE_STATE.getDesc()+"doLog");break;//某业务
                case TWO_STATE:
                    System.out.println(StateEnum.TWO_STATE.getDesc()+"doLog");break;//某业务
                case THREE_STATE:
                    System.out.println(StateEnum.THREE_STATE.getDesc()+"doLog");break;//某业务
                default:
                    System.out.println("-1 desce"+"doLog");
            }
        }
    
        /**
         * @author huey
         * @Description : 某状态的插入处理
         * @Date Created in 2018/9/23 13:08
         */
        @Override
        public void doInsert() {
            switch (this.stateEnum) {
                case ONE_STATE:
                    System.out.println(StateEnum.ONE_STATE.getDesc()+"doInsert"); break;//某业务
                case TWO_STATE:
                    System.out.println(StateEnum.TWO_STATE.getDesc()+"doInsert");break;//某业务
                case THREE_STATE:
                    System.out.println(StateEnum.THREE_STATE.getDesc()+"doInsert");break;//某业务
                default:
                    System.out.println("-1 desce"+"doInsert");
            }
        }
    
        /**
         * @author huey
         * @Description : 某状态的计算处理
         * @Date Created in 2018/9/23 13:08
         */
        @Override
        public void doCalc() {
            switch (this.stateEnum) {
                case ONE_STATE:
                    System.out.println(StateEnum.ONE_STATE.getDesc()+"doCalc");break;//某业务
                case TWO_STATE:
                    System.out.println(StateEnum.TWO_STATE.getDesc()+"doCalc");break;//某业务
                case THREE_STATE:
                    System.out.println(StateEnum.THREE_STATE.getDesc()+"doCalc");break;//某业务
                default:
                    System.out.println("-1 desce"+"doCalc");
            }
        }
    }
    package com.huey.designpattern.statepattern;
    
    import org.junit.Test;
    
    /**
     * @author huey
     * @Description : 状态测试
     * @Date Created in 2018/9/23 13:41
     */
    public class StateTest {
    
        /**
         * @author huey
         * @Description : TODO
         * @Date Created in 2018/9/28 11:17
         */
        @Test
        public void test1() {
            State state = new StateService(StateEnum.ONE_STATE);
            state.doCalc();
            state = new StateService(StateEnum.TWO_STATE);
            state.doInsert();
            state = new StateService(StateEnum.THREE_STATE);
            state.doLog();
    
    
        }
    }
    
    
    
    读者须知:

    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>;
    • [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/nrqiaftx.html