码迷,mamicode.com
首页 > 其他好文 > 详细

状态模式

时间:2020-01-17 09:59:26      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:ilo   java   next   ring   频道   音量   开机   mil   imp   

个人博客

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

输出结果

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

状态模式

标签:ilo   java   next   ring   频道   音量   开机   mil   imp   

原文地址:https://www.cnblogs.com/milovetingting/p/12203789.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!