【设计模式】状态模式

  |   0 评论   |   100 浏览

简介

允许一个对象在其内部状态改变时,改变它的行为,定义单独的状态对象,为每个状态封装特定于状态的行为。也就是说,为执行特定于状态的行为定义接口,并为每个状态定义实现接口的类,类将特定于状态的行为委托给其当前状态对象,而不是直接实现特定于状态的行为。属于行为型。

适用场景

1、一个对象存在多个状态,且状态可相互转换,不同状态下行为不同。
2、特定于状态的行为应该独立定义,也就是说,添加新状态不应该影响现有状态的行为。

优点

1、将不同状态隔离
2、把各种状态的转换逻辑,分布到State子类中,减少相互间依赖
3、增加新的状态很简单

缺点

1、状态多的场景下类的数据增加,系统变的复杂

代码示例

image.png
状态接口

public interface State {
    void writeName(StateContext context, String name);
}

小写状态类

public class LowerCaseState implements State{
    @Override
    public void writeName(StateContext context, String name) {
        System.out.println(name.toLowerCase());
	//输出一个小写之后变大写
        context.setState(new MultipleUpperCaseState());
    }
}

大写状态类

public class MultipleUpperCaseState implements State{
    //计数
    private int count = 0;
    @Override
    public void writeName(StateContext context, String name) {
        System.out.println(name.toUpperCase());
	//转换到2个之后变成小写
        if(++count > 1) {
            context.setState(new LowerCaseState());
        }
    }
}

状态上下文

public class StateContext {
    private State state;
    public StateContext() {
        state = new LowerCaseState();
    }
    void setState(State newState) {
	//改变状态
        state = newState;
    }
    public void writeName(String name) {
        state.writeName(this, name);
    }
}

测试类

public class StateTest {
    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");
    }
}

输出结果为:

monday
TUESDAY
WEDNESDAY
thursday
FRIDAY
SATURDAY
sunday

上面示例源码

源码分析

状态模式应用比较少,因为状态比较依赖具体的业务场景,框架中比较少。

也可以关注我的公众号:程序之声
图片
关注公众号,领取更多资源

本文为博主原创文章,未经博主允许不得转载。

评论

发表评论