[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
    评论
使用 JavaScript 编写的简单俄罗斯方块游戏(附源代码) 项目:使用 JavaScript 编写的简单俄罗斯方块游戏(附源代码) 该游戏是一个使用 HTML5 和 JavaScript 开发的简单项目。这款游戏允许玩家策略性地旋转下落的方块以清除关卡。要在此游戏中得分,您必须通过操纵方块来清除线条,使它们填满水平行。当方块掉落时,您必须 根据需要移动 和旋转它们,使它们均匀地排列在底部。 游戏制作 该游戏仅使用 HTML、CSS 和 JavaScript。谈到这款游戏的功能,这款游戏的 PC 控制也很简单。首先,您必须按空格键才能开始游戏。您可以使用箭头键来更改下落方块的位置。您可以在侧栏看到形成的分数和行。 该游戏包含大量的 javascript,用于对游戏的某些部分进行验证。 如何运行该项目? 要运行此游戏,您不需要任何类的本地服务器,但需要浏览器。我们建议您使用现代浏览器,如 Google Chrome 和 Mozilla Firefox, 以获得更好、更优化的游戏体验。要玩游戏,首先,单击 index.html 文件在浏览器中打开游戏。 演示: 该项目为国外大神项目,可以作为毕业设计的项目,也可以作为大作业项目,不用担心代码重复,设计重复等,如果需要对项目进行修改,需要具备一定基础知识。 注意:如果装有360等杀毒软件,可能会出现误报的情况,源码本身并无病毒,使用源码时可以关闭360,或者添加信任。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值