zoukankan      html  css  js  c++  java
  • PHP设计模式

    状态模式当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。状态模式主要解决的是当控制一个对象状态的条件表达式过于复杂时的情况。把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化。
    UML类图:
    这里写图片描述
    角色:
    上下文环境(Work):它定义了客户程序需要的接口并维护一个具体状态角色的实例,将与状态相关的操作委托给当前的具体对象来处理。
    抽象状态(State):定义一个接口以封装使用上下文环境的的一个特定状态相关的行为。
    具体状态(AmState):实现抽象状态定义的接口。

    <?php
    interface State { // 抽象状态角色
        public function handle(Context $context); // 方法示例
    }
    
    class ConcreteStateA implements State { // 具体状态角色A
        private static $_instance = null;
        private function __construct() {}
        public static function getInstance() { // 静态工厂方法,返还此类的唯一实例
            if (is_null(self::$_instance)) {
                self::$_instance = new ConcreteStateA();
            }
            return self::$_instance;
        }
    
        public function handle(Context $context) {
            echo 'concrete_a'."<br>";
            $context->setState(ConcreteStateB::getInstance());
        }
    
    }
    
    class ConcreteStateB implements State { // 具体状态角色B
        private static $_instance = null;
        private function __construct() {}
        public static function getInstance() {
            if (is_null(self::$_instance)) {
                self::$_instance = new ConcreteStateB();
            }
            return self::$_instance;
        }
    
        public function handle(Context $context) {
            echo 'concrete_b'."<br>";
            $context->setState(ConcreteStateA::getInstance());
        }
    }
    
    class Context { // 环境角色 
        private $_state;
        public function __construct() { // 默认为stateA
            $this->_state = ConcreteStateA::getInstance();
        }
        public function setState(State $state) {
            $this->_state = $state;
        }
        public function request() {
            $this->_state->handle($this);
        }
    }
    
    // client
    $context = new Context();
    $context->request();
    $context->request();
    $context->request();
    $context->request();
    /* 输出:
    concrete_a
    concrete_b
    concrete_a
    concrete_b */
    
  • 相关阅读:
    jsonp与promise封装
    屏幕自适应问题与tab状态更新数据问题
    插槽问题
    如何封装一个组件
    在url中带参数
    vuex中mapGetters,mapActions
    eventBus 与 this.$emit
    4.24上交作业
    4.23作业
    4.17作业
  • 原文地址:https://www.cnblogs.com/taozi32/p/9226850.html
Copyright © 2011-2022 走看看