zoukankan      html  css  js  c++  java
  • 状态模式

    状态模式解析:
    主体类下面有一个状态切换方法,专门根据指令切换状态
    切换状态的本质,是把一个新的对象给主体类的一个成员属性
    <?php
    
    //坦克状态的接口
    interface TankState
    {
        //坦克的攻击方法
        public function attack();
    }
    
    //坦克普通状态
    class TankState_Tank implements TankState
    {
        //坦克的攻击方法
        public function attack()
        {
            //这里简单的输出当前状态
            echo "普通状态";
        }
    }
    
    
    
    //坦克架起来的状态
    class TankState_Siege implements TankState
    {
        //坦克的攻击方法
        public function attack()
        {
            //这里简单的输出当前状态
            echo "架起来了";
        }
    }
    
    //坦克类
    class Tank
    {
        public $state;//状态
        //坦克的攻击方法
        public function __construct()
        {
            //新造出来的坦克当然是普通状态
            $this->state = new TankState_Tank();
        }
        //设置状态的方法,假设参数为玩家点击的键盘
        public function setState($key)
        {
            //如果按了s
            if($key == 's')
            {
                $this->state = new TankState_Siege();
            }
            //如果按了t
            elseif($key == 't')
            {
                $this->state = new TankState_Tank();
            }
        }
        //坦克的攻击方法
        public function attack()
        {
            //由当前状态自己来处理攻击
            $this->state->attack();
        }
    }
    
    //新造一辆坦克
    $tank = new Tank();
    //假设正好有个敌人路过,坦克就以普通模式攻击了
    $tank->attack();
    //架起坦克
    $tank->setState('s');
    //坦克再次攻击,这次是架起模式
    $tank->attack();
    //坦克回普通模式
    $tank->setState('t');
    //坦克再次攻击,这次是普通模式
    $tank->attack();
    ?>
    用途总结:状态模式可以将和状态相关的行为和属性封装,除了切换状态时,其它地方就不需要大量的判断当前状态,只要调用当前状态的方法等。
    
    实现总结:用一个接口规范状态类需要实现的方法,比如上面的TankState规定了attack()。把各个状态封装成类,将不同状态下的不同方法放入各自的状态类,比如上面的攻击方法,同时所有的状态执行接口。原来的事务类,比如上面的Tank类,只负责状态切换,一旦需要某一个方法的调用,只要交给当前状态就可以了。
  • 相关阅读:
    【BZOJ4676】Xor-Mul棋盘 拆位+状压DP
    【BZOJ4688】One-Dimensional 矩阵乘法
    【BZOJ4704】旅行 树链剖分+可持久化线段树
    【BZOJ4709】[Jsoi2011]柠檬 斜率优化+单调栈
    【BZOJ4711】小奇挖矿 树形DP
    【BZOJ4715】囚人的旋律 DP
    【BZOJ4712】洪水 树链剖分优化DP+线段树
    服务器相关 HTTP 请求错误
    RSA算法
    公钥和私钥解释
  • 原文地址:https://www.cnblogs.com/jiufen/p/5026274.html
Copyright © 2011-2022 走看看