zoukankan      html  css  js  c++  java
  • 2018/12/07《大话设计模式》【状态模式】

    《 Forever 吴建豪》洗脑~

    1:什么是状态模式?

      - 定义:当一个对象的内在状态改变时,允许改变其行为,这个对象看起开像是改了其类。

      - 哎~又来了句让人听不明白的定义......

      - 看一段代码来理解吧

    class A {
        private $state;
    
        public function __construct($state)
        {
            $this->state = $state;
        }
    
        public function echo()
        {
            if ($this->state == 'A') {
                echo 'A';
            } elseif ($this->state == 'B') {
                echo 'B';
            } elseif (...) {
                // 其他状态
            }
            else {
                echo 'xx!';
            }
        }
    }

      - 这里可以说,当 state 的状态改变时候,会改变整个类行为。

      - 为了改变这个状况,从而使用状态模式,把每个条件的逻辑移到不同的类中,通过统一的接口定义

    2:简单实现一个状态模式

    <?php
    
    interface State()
    {
        public function handle(Context $context);
    }
    
    // 状态A
    class StateA implements State
    {
        public function handle(Context $context)
        {
            if ($context->term = 1) {
                // 处理逻辑,并终止程序
            } else {
                $context.setState(new StateB());
            }
        }
    }
    
    // 状态B
    class StateB implements State
    {
        public function handle(Context $context)
        {
            if ($context->term = 2) {
                // 处理逻辑,并终止程序
            } else {
                $context.setState(new StateC());
            }
        }
    }
    
    // 状态C
    class StateC implements State
    {
        public function handle(Context $context)
        {
            // 如果还有其他状态,则继续往下走。如果没有,就在次终止程序
        }
    }
    
    
    // 新的Context类的实现
    class Context
    {
        private $state;// 用来保存 State 对象
    
        public function setState(State $state)
        {
            $this->state = $state;
        }
    
        public function request()
        {
            $this->state->handle($this);
        }
    }

    3:应用场景

      - 如果项目中存在太多的 if {...} elseif {...} else {...} 。那么你应该考虑状态模式。我觉得这个是重点考虑对象

      - 如果每个状态中处理的业务逻辑特别复杂·那么建议考虑这种方式。

      - 如果代码中的状态相对固定。比如一个电商中购买商品的流程:未支付、已过期、待发货(已支付)、已发货、已收货。那么这种状态基本上定下来不会有太大变化,状态发生在内部中,顺序固定,不需要客户端进行处理。

       

    4:参考

    https://blog.csdn.net/hel12he/article/details/51787539

  • 相关阅读:
    hud 1397
    hdu 1211
    hdu 1124
    hdu 1104
    1788
    hdu 1796
    sdut 2169
    hdu 1019
    $http post 取不到数据
    sql
  • 原文地址:https://www.cnblogs.com/25-lH/p/10083591.html
Copyright © 2011-2022 走看看