设计模式笔记_行为型_状态模式

发布于:2025-08-15 ⋅ 阅读:(14) ⋅ 点赞:(0)

1. 状态模式介绍

状态模式(State Pattern)是一种行为设计模式,它允许对象在其内部状态改变时改变其行为。状态模式主要用于对象的行为随状态变化而变化的场景。

类比场景:想象一个电风扇,它有不同的档位:关闭、低速、中速和高速。当你按下档位按钮时,电风扇会根据当前档位改变其状态和行为。状态模式就像这个电风扇的档位系统,能帮助电风扇在不同档位下表现出不同的行为。

结构组成:状态模式通常包含以下几个组成部分

  1. Context(上下文):维护一个具体状态的实例(该实例定义了当前的状态),并与客户端交互。
  2. State(状态):定义一个接口,用于封装与上下文相关的行为。
  3. ConcreteState(具体状态):实现状态接口的具体类,每个具体状态类负责实现与其状态相关的行为。

优缺点分析

  • 优点
    • 易于扩展:可以通过增加新的状态类来扩展对象的行为,而不需要修改现有状态类。
    • 清晰的状态转换:状态转换逻辑被封装在具体状态类中,使得状态之间的转换更加清晰。
    • 减少条件语句的使用:避免使用大量的条件语句来处理不同状态的行为。
  • 缺点
    • 类数量增加:每个具体状态都需要一个类,这可能导致类数量迅速增加。
    • 状态之间的紧耦合:状态之间可能会相互依赖,从而导致状态类之间的紧耦合。

适用场景:状态模式适用于以下场景

  • 对象的行为取决于其状态,并且需要在运行时根据状态改变行为。
  • 需要通过状态转换来改变对象的行为。
  • 需要避免使用大量的条件语句来处理对象的不同状态。

2. 代码演示

场景:使用状态模式实现电风扇档位的切换。

State(状态):封装与上下文的一个特定状态相关的行为

// 状态接口; Fan是上下文类
public interface FanState {
    void turnUp(Fan fan);
    void turnDown(Fan fan);
}

ConcreteState(具体状态):每个具体状态类负责实现与其状态相关的行为

// 具体状态类:风扇关闭状态
public class OffState implements FanState {
    @Override
    public void turnUp(Fan fan) {
        System.out.println("Turning fan to low speed.");
        fan.setState(new LowState());
    }
    @Override
    public void turnDown(Fan fan) {
        System.out.println("Fan is already off.");
    }
}

// 具体状态类:风扇低速状态
public class LowState implements FanState {
    @Override
    public void turnUp(Fan fan) {
        System.out.println("Turning fan to medium speed.");
        fan.setState(new MediumState());
    }
    @Override
    public void turnDown(Fan fan) {
        System.out.println("Turning fan to off.");
        fan.setState(new OffState());
    }
}

// 具体状态类:风扇中速状态
public class MediumState implements FanState {
    @Override
    public void turnUp(Fan fan) {
        System.out.println("Turning fan to high speed.");
        fan.setState(new HighState());
    }
    @Override
    public void turnDown(Fan fan) {
        System.out.println("Turning fan to low speed.");
        fan.setState(new LowState());
    }
}

// 具体状态类:风扇高速状态
public class HighState implements FanState {
    @Override
    public void turnUp(Fan fan) {
        System.out.println("Fan is already at high speed.");
    }

    @Override
    public void turnDown(Fan fan) {
        System.out.println("Turning fan to medium speed.");
        fan.setState(new MediumState());
    }
}

Context(上下文):维护一个具体状态的实例,这个实例定义了当前的状态

// 上下文类:风扇
public class Fan {
    private FanState currentState;

    public Fan() {
        currentState = new OffState(); // 初始状态为关闭
    }

    public void setState(FanState state) {
        currentState = state;
    }

    public void turnUp() {
        currentState.turnUp(this);
    }

    public void turnDown() {
        currentState.turnDown(this);
    }
}

客户端:只与上下文(Fan)打交道,不涉及直接接触具体状态

public class StatePatternDemo {
    public static void main(String[] args) {
        Fan fan = new Fan();
        fan.turnUp();   // Turning fan to low speed.
        fan.turnUp();   // Turning fan to medium speed.
        fan.turnDown(); // Turning fan to low speed.
        fan.turnDown(); // Turning fan off.
    }
}

对应的类图:


网站公告

今日签到

点亮在社区的每一天
去签到