美文网首页
状态模式

状态模式

作者: YoungerDev | 来源:发表于2018-04-10 09:05 被阅读43次

Android进阶之设计模式

状态模式

定义: 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类.

使用场景:

  1. 一个对象的行为取决于它的状态,而且他必须在运行时根据状态改变它的行为.
  2. 代码中包含大量与对象状态有关的条件语句.

举个电视剧的例子:

第一版代码:

//电视遥控器,含有 开机,关机,下一个频道,上一个频道,调高音量,调低音量
public class TVController {
    //开机状态
    private final static int POWER_ON = 1;

    //关机状态
    private final static int POWER_OFF = 2;

    private int state = POWER_OFF;

    public void powerOn(){
        if (state == POWER_OFF){
            System.out.println("开机啦");
        }
        state = POWER_ON;
    }

    public void powerOff(){
        if (state ==POWER_ON){
            System.out.println("关机啦");
        }
        state = POWER_OFF;
    }

    public void nextChannel(){
        if (state == POWER_ON){
            System.out.println("下一个频道");
        }else {
            System.out.println("两个红灯提示没有开机");
        }
    }


    public void prevChannel(){
        if (state == POWER_ON){
            System.out.println("上一个频道");
        }else {
            System.out.println("两个红灯提示没有开机");
        }
    }

    public void turnUp(){
        if (state == POWER_ON){
            System.out.println("调高音量");
        }else {
            System.out.println("两个红灯提示没有开机");
        }
    }

    public void turnDown(){
        if (state == POWER_ON){
            System.out.println("调低音量");
        }else {
            System.out.println("两个红灯提示没有开机");
        }
    }
}

这样就有很多重复代码,相对较为混乱. 下面就使用状态模式 简单处理一下.


//定义电视操作的函数
public interface TvState {

    public void nextChannel();

    public void prevChannel();

    public void turnUp();

    public void turnDown();

}

public class PowerOffStatus implements TvState{
    @Override
    public void nextChannel() {

    }

    @Override
    public void prevChannel() {

    }

    @Override
    public void turnUp() {

    }

    @Override
    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 interface PowerController {

    public void powerOn();

    public void powerOff();
}


public class TvControll implements PowerController{
    TvState tvState;

    public void setTvState(TvState tvState) {
        this.tvState = tvState;
    }

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

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

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

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

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

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

}

Client 使用


 public static void main(String[] args) {
 
        TvControll tvControll = new TvControll();

        //设置开机状态
        tvControll.powerOn();
        //下一个频道

        tvControll.nextChannel();

        //调高音量
        tvControll.turnUp();

        //关机状态
        tvControll.powerOff();
        //调低音量
        tvControll.turnDown();

}

打印出来的:

开机啦
下一个频道
声音跳大
关机啦

关机后没有办法调低音量的. 这个虽然代码,类多了,但是逻辑很清晰明了.

相关文章

  • State模式

    状态模式(State模式) 定义 状态模式,又称状态对象模式(Pattern of Objects for S...

  • 设计模式-状态模式

    设计模式-状态模式 设计模式 状态模式的关键是区分事物内部的状态

  • 状态模式(状态机模式)

    状态模式学习笔记 前言:文章从三方面简单阐述状态模式:是什么、为什么、如何做。这是我在工作之余自己的一些理解、思考...

  • C++设计模式(3)

    本文预览: 状态模式 组合模式 迭代器 职责链 命令 状态模式 定义:状态模式(State Pattern),允许...

  • 设计模式——状态模式

    定义 状态模式,又称状态对象模式(Pattern of Objects for States),状态模式是对象的行...

  • 第5章 -行为型模式-状态模式

    一、状态模式的简介 二、状态模式的优缺点 三、状态模式的实例

  • 状态模式

    Android进阶之设计模式 状态模式 定义: 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了...

  • 状态模式

    状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。允许对象随着状态改变而改变行为。 策略...

  • 状态模式

    《大话设计模式》阅读笔记和总结。原书是C#编写的,本人用Java实现了一遍,包括每种设计模式的UML图实现和示例代...

  • 状态模式

    状态模式 一个对象有状态变化 每次状态变化都会触发一个逻辑 不能总是用 if...else 来控制 示例 交通灯信...

网友评论

      本文标题:状态模式

      本文链接:https://www.haomeiwen.com/subject/qfkghftx.html