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");
        }
    }

    二、框架中的状态模式

     暂时没有发现

  • 相关阅读:
    重温.NET Remoting(四)
    asp.net mvc3的变态错误
    绝对定位与相对低位的应用
    Tsql script for Job
    Entlib5.0之数据查询
    Jquery Mobile dialog的生命周期
    关于委托Lamda表达式等的一个小例子
    网上摘录 数据分组处理
    Oracle 要点摘录
    [原創]另一種思路固定URL及.NET實現
  • 原文地址:https://www.cnblogs.com/wqff-biubiu/p/12741931.html
Copyright © 2011-2022 走看看