美文网首页
状态模式

状态模式

作者: 贾里 | 来源:发表于2017-07-31 21:26 被阅读24次

定义

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

角色

  • 1.环境(Context)角色 上下文:
    定义客户端所感兴趣的接口,并且保留一个具体状态类的实例。这个定义了对象的当前状态
  • 2.抽象状态(State)角色
    定义一个接口,用以封装环境(Context)对象的一个特定的状态所对应的行为。
  • 3.具体状态(ConcreteState)角色
    每一个具体状态类都实现了环境(Context)的一个状态所对应的行为。

开发中

如果一个事件在不同状态下处理的事情不同,通常用if else 来判断状态在做处理,如果有很多触发事件只是在几个状态中,那么就需要对每个触发事件都做一个不同的判断;或者在某些情况下要添加、移除一个事件,那么这样是非常费事的。
比如说计算机的大小写,如果让每个按键都做一个判断,那就要26次判断;加入我们在按按键的时候,提前设置状态,然后再状态抽象中去做处理,就方便得多;

简单实现:
(1)抽象一个状态接口,接口中定义触发事件的方法名
(2)创建不同状态的类(大写、小写两个类),都实现状态接口;
(3)创建一个控制器,控制状态和触发事件;
(4)客户端只需要去调用控制器就可以;

代码

环境Context

public class TvContext {
    private TVState tvState=new PowerOff();
    public void setTate(TVState tvState)
    {
        this.tvState=tvState;
    }
    
    public void turnOn()
    {
        setTate(new PowerOn());
        tvState.turnOn();
    }
    
    public void turnOff()
    {
        setTate(new PowerOff());
        tvState.turnOff();
    }
    
    public void nextChannel()
    {
        tvState.nextChannel();
    }
    public void preChannel() {
        tvState.preChannel();
    }   
}

抽象状态接口

public interface TVState {
    public void nextChannel();

    public void preChannel();

    public void  turnOn();

    public void turnOff();
}

具体状态

public class PowerOff implements TVState{
    @Override
    public void nextChannel() {
    }

    @Override
    public void preChannel() {
        
    }

    @Override
    public void turnOn() {
        System.out.println("开机");
    }

    @Override
    public void turnOff() {
        System.out.println("关机 无效");
    }
}

使用场景

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

需求

电视遥控器,分为开机和关机两种状态,在开机状态下可以通过遥控器进行频道切换,调整音量操作,但是开机键是无效的。在关机状态下 频道切换,调整音量,关机都是无效的。只有开机键是有效的。

Android中应用

1.WiFi、GPRS等状态
2.用户的是否登陆状态(用户转发、评论、购买等都需要判断用户登录状态)

相关文章

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