美文网首页
状态模式

状态模式

作者: 明朗__ | 来源:发表于2017-02-28 15:10 被阅读9次

定义:
当一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。又称状态对象模式,状态模式是对象的行为模式。

使用场景:

  1. 一个对象的行为取决于他的状态,并且他必须在运行时根据状态改变他的行为
  2. 代码中包含大量与对象相关的条件语句,例如一个操作中含有多分支语句。这些分支历来与该对象
  3. 状态模式将每一个条件分支放入一个独立类中,这使得你可以根据对象自身的情况将状态作为一个对象。这一对象可以不依赖于其他对象而独立变化。这样通过过多的,重复的if-else分支语句

案例(电视剧开关机 和选择上一个和下一个频道)

  1. 抽象状态(State)角色
//定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。
public interface TvState {
     void nextChannel();//下一个频道
     void preChannel();//上一个频道
     void  turnOn();//开机
     void  turnOff();//关机
}
  1. 具体状态(ConcreteState)角色
每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。
//关机状态
public class PowerOffState implements TvState {
    @Override
    public void nextChannel() {
        System.out.print("无效"+"\n");
    }

    @Override
    public void preChannel() {
        System.out.print("无效"+"\n");
    }

    @Override
    public void turnOn() {
        System.out.print("无效"+"\n");
    }

    @Override
    public void turnOff() {
        System.out.print("关机了"+"\n");
    }
}
//开机状态下
public class PowerOnState implements TvState {
    @Override
    public void nextChannel() {
        System.out.print("下一个频道"+"\n");
    }

    @Override
    public void preChannel() {
        System.out.print("上一个频道"+"\n");
    }

    @Override
    public void turnOn() {
        System.out.print("开机了"+"\n");
    }

    @Override
    public void turnOff() {
        System.out.print("关机了"+"\n");
    }
}
  1. 环境(Context)角色
//上下文:定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个定义了对象的当前状态
public class TvControl {
    TvState mTvState;
    public  void setState(TvState mTvState){
        this.mTvState=mTvState;
    }
    public void powerOn(){
        setState(new PowerOnState());//开机
        mTvState.turnOn();
    }
    public void powerOff(){
        setState(new PowerOffState());//关机
        mTvState.turnOff();
    }
    public void nextChannel() {
        mTvState.nextChannel();//上一个频道
    }

    public void preChannel() {
        mTvState.preChannel();//下一个频道
    }

    public void turnOn() {
        mTvState.turnOn();//开机
    }

    public void turnOff() {
        mTvState.turnOff();//关机
    }
}
  1. 客户端调用
public class MyClass {
    public static void main(String[] args){
        TvControl tvControl=new TvControl();
        tvControl.powerOn();//开机
        tvControl.nextChannel();//下一个频道
        tvControl.preChannel();//上一个频道
        tvControl.powerOff();//关机
        tvControl.powerOff();//关机
    }
}
开机了
下一个频道
上一个频道
关机了
关机了

相关文章

  • 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/wmmxgttx.html