设计模式——状态模式

一、定义与简单实现

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

二、框架中的状态模式

 暂时没有发现

posted on 2020-04-21 01:53  FFStayF  阅读(400)  评论(0编辑  收藏  举报