[Java] [设计模式] [行为型模式] [ 状态模式 ]

定义

状态模式中,行为是由状态来决定的,不同状态下有不同行为。状态模式和策略模式的结构几乎是一模一样的,主要是他们表达的目的和本质是不同。

示例

public interface TvState {
        public void nextChannel();

        public void prevChannel();

        public void turnUp();

        public void turnDown();
    }

    public class PowerOffState implements TvState {
        public void nextChannel() {
            out.println("power off, can't receive signal !");
        }

        public void prevChannel() {
            out.println("power off, can't receive signal !");
        }

        public void turnUp() {
            out.println("power off, can't receive signal !");
        }

        public void turnDown() {
            out.println("power off, can't receive signal !");
        }
    }

    public class PowerOnState implements TvState {
        public void nextChannel() {
            System.out.println("power on, 接收到信号:下一频道");
        }

        public void prevChannel() {
            System.out.println("power on, 接收到信号:上一频道");
        }

        public void turnUp() {
            System.out.println("power on, 接收到信号:调高音量");
        }

        public void turnDown() {
            System.out.println("power on, 接收到信号:调低音量");
        }
    }

    public class TvSet{
        public TvSet(TvState state) {
            setmTvState(state);
        }

        public TvState getmTvState() {
            return mTvState;
        }

        public void setmTvState(TvState mTvState) {
            this.mTvState = mTvState;
        }

        private TvState mTvState;
    }

    public class TvController {
        public void nextChannel(TvState mTvState) {
            mTvState.nextChannel();
        }

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

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

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

    public class ClientUser{
        public void testUserAction(){
            TvController mTvController = new TvController();
            TvSet tv = new TvSet(new PowerOffState());

            out.println("tv power off");
            mTvController.turnUp(tv.getmTvState());
            mTvController.turnDown(tv.getmTvState());
            mTvController.prevChannel(tv.getmTvState());
            mTvController.nextChannel(tv.getmTvState());

            out.println("tv power on");
            tv.setmTvState(new PowerOnState());

            mTvController.turnUp(tv.getmTvState());
            mTvController.turnDown(tv.getmTvState());
            mTvController.prevChannel(tv.getmTvState());
            mTvController.nextChannel(tv.getmTvState());
        }

    }

Android中的实例

Android源码中很多地方都有用到状态模式,举一个例子,就是Android的WIFI管理模块。
当WIFI开启时,自动扫描周围的接入点,然后以列表的形式展示;当wifi关闭时则清空。这里wifi管理模块就是根据不同的状态执行不同的行为。
Phone模块中,Framework层中接收RIL模块消息,对SMS消息处理,也使用了状态模式。
详细见StateMachine.java,InboundSmsHandler.java,GsmInboundSmsHandler.java。

StateMachine类是Android系统封装的层次状态机类, 从Goolge给出的解释:The state machine defined here is a hierarchical state machine which processes messages and can have states arranged hierarchically. 在Android世界里,StateMachine也叫做层次状态机,简称HSM,这里的HSM主要用来处理消息并且分层次管理其状态。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值