zoukankan      html  css  js  c++  java
  • 设计模式——状态模式

    一、定义与简单实现

    1、定义

    状态模式,是一种行为型模式,允许对象在内部状态改变时改变它的行为

    2、UML图

    状态模式的UML类图与策略模式的UML类图一模一样,维基百科上也称状态模式可解释成策略模式两者都定义算法族,分别封装起来,让它们之间可以互相替换,使得程序更具有弹性

    但两种模式区别就在于它们的“意图”。

    策略模式:定义多个算法实现,通常由客户主动指定某一个具体的算法实现。

    状态模式:定义多个状态实现,随着时间流逝,会自动转换状态实现,改变对象的行为,而不需要客户主动指定算法的实现对象。

    状态模式经常被用来实现内部状态自动装换的逻辑(状态机)。

    3、简单实现

    自动状态转换,一次小写,两次大写循环。不需要客户设置。

    public interface State {
        void writeName(StateContext context, String name);
    }
    
    public class LowerCaseState implements State {
    
        private State state;
    
        public void setState(State state){
            this.state = state;
        }
    
        @Override
        public void writeName(StateContext context, String name) {
            System.out.println(name.toLowerCase());
            //转换两次大写
            context.setState(state == null ? new MultipleUpperCaseState(): state);
        }
    }
    
    public class MultipleUpperCaseState implements State {
        private int count = 0;
        private State state;
    
        public void setState(State state){
            this.state = state;
        }
    
        @Override
        public void writeName(StateContext context, String name) {
            System.out.println(name.toUpperCase());
            if(++count > 1){
    count = 0;
    //两次大写后转换到一次小写 context.setState(state == null ? new LowerCaseState() : state); } } } public class StateContext { private State state; public StateContext(){ this.state = new LowerCaseState(); } public void setState(State state){ this.state = state; } public void writeName(String name){ state.writeName(this,name); } } public class Main { public static void main(String[] args) { StateContext context = new StateContext(); context.writeName("Monday"); context.writeName("Tuesday"); context.writeName("Wednesday"); context.writeName("Thursday"); context.writeName("Friday"); context.writeName("Saturday"); context.writeName("Sunday"); } }

    算法的灵活性,可动态增加算法实现,例如新增一个不转化大小写实现,然后改变状态,一次小写,一次不变,两次大写 循环

    不需要修改原状态代码。

    public class NoCaseState implements State {
    
        private State state;
    
        public void setState(State state){
            this.state = state;
        }
    
        @Override
        public void writeName(StateContext context, String name) {
            System.out.println(name);
            context.setState(state == null ? new LowerCaseState() : state);
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            //一次小写,一次不变,两次大写 循环
            StateContext context = new StateContext();
            LowerCaseState lowerCaseState = new LowerCaseState();
            MultipleUpperCaseState multipleUpperCaseState = new MultipleUpperCaseState();
            multipleUpperCaseState.setState(lowerCaseState);
            NoCaseState noCaseState = new NoCaseState();
            lowerCaseState.setState(noCaseState);
            noCaseState.setState(multipleUpperCaseState);
            context.setState(lowerCaseState);
            context.writeName("Monday");
            context.writeName("Tuesday");
            context.writeName("Wednesday");
            context.writeName("Thursday");
            context.writeName("Friday");
            context.writeName("Saturday");
            context.writeName("Sunday");
            context.writeName("Monday");
        }
    }

    二、框架中的状态模式

     暂时没有发现

  • 相关阅读:
    《数据可视化之美》阅读(二)
    《数据可视化之美》阅读
    D3学习之动画和变换
    Java学习之垃圾回收
    程序员思维修炼 --- 读书笔记(二)
    程序员思维修炼 --- 读书笔记(一)
    Java 学习笔记 ------第六章 继承与多态
    Java 学习笔记 ------第五章 对象封装
    Java 学习笔记 ------第四章 认识对象
    (转)synchronized底层实现原理&CAS操作&偏向锁、轻量级锁,重量级锁、自旋锁、自适应自旋锁、锁消除、锁粗化
  • 原文地址:https://www.cnblogs.com/wqff-biubiu/p/12741931.html
Copyright © 2011-2022 走看看