状态模式

Posted milovetingting

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了状态模式相关的知识,希望对你有一定的参考价值。

个人博客

http://www.milovetingting.cn

状态模式

模式介绍

状态模式中的行为是由状态来决定的,不同状态下有不同的行为。

模式定义

当一个对象的内在状态改变时允许其改变行为。

使用场景

  1. 一个对象的行为取决于它的状态,并且它必须在运行时根据状态来改变行为。

  2. 代码中包含大量与对象状态有关的条件语句。

简单使用

定义状态接口

public interface TvState {
    public void nextChannel();
    public void prevChannel();
    public void turnUp();
    public void turnDown();
}

定义实现类

public class PowerOnState implements TvState {

    @Override
    public void nextChannel() {
        System.out.println("下一个频道");
    }

    @Override
    public void prevChannel() {
        System.out.println("上一个频道");
    }

    @Override
    public void turnUp() {
        System.out.println("增加音量");
    }

    @Override
    public void turnDown() {
        System.out.println("减小音量");
    }

}

public class PowerOffState implements TvState{

    @Override
    public void nextChannel() {
        
    }

    @Override
    public void prevChannel() {
        
    }

    @Override
    public void turnUp() {
        
    }

    @Override
    public void turnDown() {
        
    }

}

定义控制类接口

public interface PowerController {
    public void powerOn();
    public void powerOff();
}

定义控制类的实现类

public class TvController implements PowerController {

    private TvState mTvState;

    private void setTvState(TvState tvState) {
        mTvState = tvState;
    }

    @Override
    public void powerOn() {
        setTvState(new PowerOnState());
        System.out.println("开机啦");
    }

    @Override
    public void powerOff() {
        setTvState(new PowerOffState());
        System.out.println("关机啦");
    }

    public void nextChannel() {
        mTvState.nextChannel();
    }

    public void prevChannel() {
        mTvState.prevChannel();
    }

    public void turnUp() {
        mTvState.turnUp();
    }

    public void turnDown() {
        mTvState.turnDown();
    }

}

调用

public static void main(String[] args) {
        TvController tvController = new TvController();
        tvController.powerOn();
        tvController.nextChannel();
        tvController.turnUp();
        tvController.powerOff();
        tvController.turnDown();
    }

输出结果

开机啦
下一个频道
增加音量
关机啦

以上是关于状态模式的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段13——Vue的状态大管家

VSCode自定义代码片段13——Vue的状态大管家

方向/配置更改后如何维护 ListView 片段状态?

java BottomBarNavigation代码保留片段状态

为不同方向使用不同布局时,在方向更改时保存片段状态

多选模式列表视图行在删除后保持选中状态