设计模式学习(十七):状态模式

设计模式,学习,十七,状态,模式 · 浏览次数 : 25

小编点评

**状态模式** 状态模式是一种行为型模式,用于在对象的行为依赖于它的状态(属性)而改变其相关行为。 **状态模式中的状态** * **状态(State)**:表示对象的当前状态,例如「 sad」、「 happy」。 * **状态转换器(StateTransitions)**:定义了状态之间的转换规则。 **状态模式的常见状态** * **初始状态(initialState)**:当对象创建时处于的初始状态。 * **最终状态(finalState)**:当对象达到这个状态时,无法再进行任何操作。 * **其他状态**:用于存储中间状态的状态。 **状态模式的用法** 1. 创建一个状态对象,指定其初始状态。 2. 通过状态转换器,将对象从一个状态状态转换为另一个状态状态。 3. 当状态发生变化时,执行相应的行为。 **状态模式的优点** * **可扩展性:**通过添加新的状态,可以扩展状态模式的功能。 * **响应性:**状态模式可以响应对象的各种状态变化。 * **状态转换的清晰性:**状态转换器的定义可以清晰地描述对象的行为变化。 **示例** ```java public class Person { private State state; public Person(State state) { this.state = state; } void cry() { state.cry(); } void smile() { state.smile(); } void say() { state.say(); } } interface State { void cry(); void smile(); void say(); } class SadState implements State { @Override public void cry() { System.out.println("Sad cry"); } @Override public void smile() { System.out.println("Sad smile"); } @Override public void say() { System.out.println("Sad say"); } } class HappyState implements State { @Override public void cry() { System.out.println("happy cry"); } @Override public void smile() { System.out.println("happy smile"); } @Override public void say() { System.out.println("happy say"); } } public class Main { public static void main(String[] args) { Person person = new Person(new SadState()); person.cry(); person.say(); person.smile(); person = new Person(new HappyState()); person.cry(); person.say(); person.smile(); } } ``` **总结** 状态模式是一种功能强大的设计模式,可用于创建响应对象的系统。通过定义对象的状态和状态转换器,可以使系统根据不同的状态采取不同的行为。

正文

设计模式学习(十七):状态模式

作者:Grey

原文地址:

博客园:设计模式学习(十七):状态模式

CSDN:设计模式学习(十七):状态模式

状态模式

状态模式是一种行为型模式。

对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

举例说明:

Person 有 Cry , Smile , Say 三种行为,但是在不同状态( SadState , HappyState )下,这三种行为不一样,

public class Person {
    private State state;

    public Person(State state) {
        this.state = state;
    }

    void cry() {
        state.cry();
    }

    void smile() {
        state.smile();
    }

    void say() {
        state.say();
    }
}

在 Sad 状态下,行为可能是:

public class SadState implements State {
    @Override
    public void cry() {
        System.out.println("Sad cry");
    }

    @Override
    public void smile() {
        System.out.println("Sad smile");
    }

    @Override
    public void say() {
        System.out.println("Sad say");
    }
}

Happy 状态下同理


public class HappyState implements State {

    @Override
    public void cry() {
        System.out.println("happy cry");
    }

    @Override
    public void smile() {
        System.out.println("happy smile");
    }

    @Override
    public void say() {
        System.out.println("happy say");
    }
}

那么主方法在调用的时候:

public class Main {
    public static void main(String[] args) {
        Person person = new Person(new SadState());
        person.cry();
        person.say();
        person.smile();
        person = new Person(new HappyState());
        person.cry();
        person.say();
        person.smile();
    }
}

Person 就可以根据不同的状态来执行 cry ,say ,smile 的行为了

上述示例的 UML 图如下

image

状态模式的应用

UML 和 代码

UML 图

代码

更多

设计模式学习专栏

参考资料

与设计模式学习(十七):状态模式相似的内容:

设计模式学习(十七):状态模式

设计模式学习(十七):状态模式 作者:Grey 原文地址: 博客园:设计模式学习(十七):状态模式 CSDN:设计模式学习(十七):状态模式 状态模式 状态模式是一种行为型模式。 对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 举例说明: Person 有 Cry ,

设计模式学习(十三):观察者模式

设计模式学习(十三):观察者模式 作者:Grey 原文地址: 博客园:设计模式学习(十三):观察者模式 CSDN:设计模式学习(十三):观察者模式 观察者模式 观察者模式是一种行为型模式。在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。 一般可以用做事件处理

设计模式学习(十):门面模式

设计模式学习(十):门面模式 作者:Grey 原文地址: 博客园:设计模式学习(十):门面模式 CSDN:设计模式学习(十):门面模式 门面模式 门面模式是一种结构型模式。 门面模式为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。 假设建造一个房子需要有如下三个步骤: 第一步,和泥 第二

设计模式学习(十一):组合模式

设计模式学习(十一):组合模式 作者:Grey 原文地址: 博客园:设计模式学习(十一):组合模式 CSDN:设计模式学习(十一):组合模式 组合模式 组合模式是一种结构型模式。 组合模式中,最常用的一个用法就是目录层级的遍历,话不多说,直接上代码,主方法中 public class Main {

设计模式学习(十二):享元模式

设计模式学习(十二):享元模式 作者:Grey 原文地址: 博客园:设计模式学习(十二):享元模式 CSDN:设计模式学习(十二):享元模式 享元模式 享元模式是一种结构型模式。 一个应用场景是:运用共享技术有效地支持大量细粒度的对象。主要解决 在有大量对象时,有可能会造成内存溢出,我们把其中共同的

设计模式学习(十四):模板方法

设计模式学习(十四):模板方法 作者:Grey 原文地址: 博客园:设计模式学习(十四):模板方法 CSDN:设计模式学习(十四):模板方法 模板方法 模板方法是一种行为型模式。 假设我们要实现一个游戏,这个游戏有「初始化」,「启动」,「结束」三个方法,那么可以定义一个游戏的模板: public a

设计模式学习(十五):策略模式

设计模式学习(十五):策略模式 作者:Grey 原文地址: 博客园:设计模式学习(十五):策略模式 CSDN:设计模式学习(十五):策略模式 策略模式 策略模式是一种行为型模式,它定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。 以实例来说明 假设我们有一个猫类,这个类里面有体重和身高

设计模式学习(十六):责任链模式

设计模式学习(十六):责任链模式 作者:Grey 原文地址: 博客园:设计模式学习(十六):责任链模式 CSDN:设计模式学习(十六):责任链模式 责任链模式 责任链模式是一种行为型模式。 举例说明:有一段文本需要过滤一系列敏感字,我们可以通过责任链模式来设计这个功能,假设文本是 scripts H

设计模式学习(十八):迭代器模式

设计模式学习(十八):迭代器模式 作者:Grey 原文地址: 博客园:设计模式学习(十八):迭代器模式 CSDN:设计模式学习(十八):迭代器模式 迭代器模式 迭代器模式是一种行为型模式。 迭代器最典型的应用是容器遍历 模仿 JDK 的容器,我们自定义一个容器并实现 iterator 方法; 首先,

设计模式学习(十九):访问者模式

设计模式学习(十九):访问者模式 作者:Grey 原文地址: 博客园:设计模式学习(十九):访问者模式 CSDN:设计模式学习(十九):访问者模式 访问者模式 访问者模式是一种行为型模式。 访问者模式在结构不变的情况下动态改变对于内部元素的动作。 举例说明: 假设我们需要构造一台电脑,有主板( Bo