(20)状态模式

(20)状态模式

定义:当-个对象内在状态改变时允许其改变行为,这个对象看起来像改变了其类。)

类型:行为型模式

类图:

状态模式结构:

State:抽象状态角色,接口或抽象类,负责对象状态定义,并且封装环境角色以实现状态切换。

ConcreteState:具体状态角色,每一个具体状态必须完成两个职责:本状态的行为管理以及趋向状态处理,通俗地说,就是本状态下要做的事情,以及本状态如何过渡到其他状态。

Context:环境角色,定义客户端需要的接口,并且负责具体状态的切换。

通用代码实现:

实例:push显示红->黄->绿,pull显示绿->黄->红

public interface State {
    public void handlePush(Context context);
    public void handlePull(Context context);
    public String getColor();
}
public class Context {
    private State state = null;
    public State getState() {
        return state;
    }

    public void setState(final State state) {
        this.state = state;
    }

    public void push() {
        state.handlePush(this);
    }

    public void pull() {
        state.handlePull(this);
    }
}
//RED
public class ConcreteStateA implements State {
    @Override
    public void handlePush(final Context context) {
        System.out.print(this.getColor());

        final State state = new ConcreteStateB();
        context.setState(state);
        state.handlePush(context);
    }

    @Override
    public void handlePull(final Context context) {
        System.out.print(this.getColor());
    }

    @Override
    public String getColor() {
        return "RED";
    }
}
//YELLOW
public class ConcreteStateB implements State {
    @Override
    public void handlePush(final Context context) {
        System.out.print(this.getColor());
        final State state = new ConcreteStateC();
        context.setState(state);
        state.handlePush(context);
    }

    @Override
    public void handlePull(final Context context) {
        System.out.print(this.getColor());
        final State state = new ConcreteStateA();
        context.setState(state);
        state.handlePull(context);
    }

    @Override
    public String getColor() {
        return "YELLOW";
    }
}
//Green
public class ConcreteStateC implements State {
    @Override
    public void handlePush(final Context context) {
        System.out.print(this.getColor());
    }

    @Override
    public void handlePull(final Context context) {
        System.out.print(this.getColor());
        final State state = new ConcreteStateB();
        context.setState(state);
        state.handlePull(context);
    }

    @Override
    public String getColor() {
        return "GREEN";
    }
}

运行结果

PUSH:
REDYELLOWGREEN
PULL:
GREENYELLOWRED

状态模式的优点:

l  结构清晰:避免了过多的switch... case或者if... else语句的使用,避免了程序的复杂性,提高系统的可维

l  护性.

l  遵循设计原则:很好地体现了开闭原则和单一职责原则,每个状态都是一个子类,你要增加状态就要增加

l  子类,你要修改状态,你只修改一个子类就可以了.

l  封装性非常好:这也是状态模式的基本要求,状态变换放置到类的内部来实现,外部的调用不用知道类内部如何实现状态和行为的变换。

状态模式的缺点:

l  只有一个缺点,子类会太多,也就是类膨胀。如果一个事物有很多个状态,如果完全使用状态模式就会有太多的子类,不好管理,需要开发者在项目衡量。

状态模式的适用场景:

行为随状态改变而改变的场景:这也是状态模式的根本出发点,例如权限设计,人员的状态不同即使执行相同的行为结果也会不同,在这种情况下需要考虑使用状态模式。

条件、分支判断语句的替代者:在程序中大量使用swith语句或者if判断语句会导致程序结构不清晰,逻辑揭乱,使用状态模式可以很好地避免这一问题,它通过扩展子类实现了条件的判断处理。

注意事项:

l  状态模式适用于当某个对象在它的状态发生改变时,它的行为也随着发生比较大的变化,也就是说在行为受状态约束的情况下可以使用状态模式,而且使用时对象的状态最好不要超过5个。

时间: 2024-08-05 11:14:05

(20)状态模式的相关文章

[设计模式] 20 状态模式 State Pattern

在GOF的<设计模式:可复用面向对象软件的基础>一书中对状态模式是这样说的:允许一个对象在其内部状态改变时改变它的行为.对象看起来似乎修改了它的类.状态模式的重点在于状态转换,很多时候,对于一个对象的状态,我们都是让这个对象包含一个状态的属性,这个状态属性记录着对象的具体状态,根据状态的不同使用分支结构来执行不同的功能,就像上面的代码那样处理:就像上面说的,类中存在大量的结构类似的分支语句,变得难以维护和理解.状态模式消除了分支语句,就像工厂模式消除了简单工厂模式的分支语句一样,将状态处理分散

二十三种设计模式[20] - 状态模式(State Pattern)

前言 状态模式,对象行为型模式的一种.在<设计模式 - 可复用的面向对象软件>一书中将之描述为" 允许一个对象在其内部状态改变时改变它的行为,使对象看起来似乎修改了它的类 ". 场景 我们都坐过火车,火车可以简单的分为" 开门 "," 关门 "," 运行 "," 停止 "四个状态.火车在这四个状态下分别可以做不同的事情.比如只有在关门时才行运行.只有在停止时才能开门. 我们在开发类似的业务时,往

javascript 写状态模式

写了状态模式的切换,以及分支循环.but 怎么实现子状态嵌套呢? /** * by JackChen 2016-3-26 11.51.20 * * 状态模式: * 一个状态到另一个状态的变换.其实可以把程序中变换复杂的流程抽离出来. * 譬如Level2中状态的变换比较复杂,完全可以又外部来处理状态的变换. * 通过在状态对象中指定切换状态的条件判断.读取当前的运行情况决定. * 而核心类只需管理自己需要进行什么具体操作即可,不用管外部切换 */ ////////////////////////

23种状态模式的理解

总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代器模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 工厂方法模式 首先,良好的封装性,代码结构清晰.一个对象创建是有条件约束的,如一个调用者需要一个具体的产品对象,只要知道这个产品的类名就可以

第20章 状态模式(State Pattern)

原文 第20章 状态模式(State Pattern) 状态模式  概述:   当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. 意图:   允许一个对象在其内部状态改变时改变它的行为 结构图:                 举例:                      在日常生活中最为熟悉的点灯开关,按一下开灯,在按一下关

设计模式(20)--State(状态模式)--行为型

作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行为模式. 状态模式允许一个对象在其内部状态改变的时候改变其行为.这个对象看上去就像是改变了它的类一样. 2.模式特点: 状态模式的主要优点在于封装了转换规则,并枚举可能的状态,它将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为,还可以

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 责任链模式概念和例子 使用的条件 和状态模式的比较分析 责任链的优缺点 纯的责任链和不纯的责任链 javax.servlet.Filter#doFilter()方法源码分析 基于AOP思想,模拟一个拦截器 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂业务逻辑判断的,那么他们有什么不同呢?回忆状态模式——状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象

状态模式

使用场景 业务中比较多的状态,不同状态下需要做的事情不同.这样,每个步骤中都需要判断一下当前属于什么状态,状态过滤完成以后对相应的状态作出处理.当前状态执行完成以后,可能需要根据条件进入下一个状态(可能是下一个状态,可能是上一个状态,可能是终止或者回到初始状态等).这种逻辑判断完以后一般都会出现比较多的if...else或者switch...case.最可怕的是后面如果加入一个状态或者修改状态相应的处理动作,这样就比较麻烦了.状态模式通过把状态拆分成不同的状态类来拆解条件.这样,在以后改变需求时

设计模式-状态模式(State Pattern)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 状态模式简介 状态模式允许一个对象在其内部状态改变的时候改变它的行为,他的内部会存着好几种状态,在当前状态发生变化是,这个对象执行和之前相同的操作也会有不同的作用效果. 状态模式的定义和基本结构 定义:状态模式允许一个对象在其内部状态改变的时候改变它的行为,就像变成了另一个对象一样. 一张来自<Head First>的结构图 Context:这个类里面包含了很多种状态类,当前状态不同时,这个