大话设计模式之----状态模式

<?php
    #状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来就像是改变了其类。
    //抽象状态
    abstract class State{
        public $w;
        abstract function WriteProgram($w);
    }
    
    //上午和中午工作状态类
    class ForenoonState extends State{
        function WriteProgram($w){
            if($w->Hour<12){
                echo "当前时间:".$w->Hour ."点 上午工作,精神百倍";
            }else{
                $w->SetState(new NoonState());
                $w->WriteProgram();
            }
        }
    }
    
    //中午工作状态
    class NoonState extends State{
        public function WriteProgram($w){
            if($w->Hour<13){
                echo "当前时间:".$w->Hour ."点 饿了,午饭;犯困,午休。";
            }else{
                $w->setState(new AfternoonState());
                $w->WriteProgram();
            }
        }
    }
    
    //下午工作状态
    class AfternoonState extends State{
        public function WriteProgram($w){
            if($w->Hour<17){
                echo ‘当前时间:‘.$w->Hour ."点 下午状态还不错,继续努力";
            }else{
                $w->SetState(new EveningState());
                $w->WiteProgram();
            }
        }
    
    }
    
    //晚间工作状态
    class EveningState extends State{
        public function WriteProgram($w){
            if($w->TaskFinished){//工作完成时
                $w->SetState(new RestState());
                $w->WriteProgram();
            }else{
                if($w->Hour<21){
                    echo "当前时间".$w->Hour ."点 加班哦,疲累之极";
                }else{
                    $w->SetState(new SleepingState());
                    $w->WriteProgram();
                }
            }
        }
    }
    
    //睡眠状态和下班休息状态
    //睡眠状态
    class SleepingState extends State
    {
        public function WriteProgram($w){
            echo "当前时间:".$w->Hour."点不行了,睡着了";
        }
    }
    
    //下班休息状态
    class RestState extends State{
        public function WriteProgram($w){
            echo "当前时间:".$w->Hour ."点下班回家了";
        }
    }
    
    //工作类
    class Work{
        private $current;
        private $Hour;
        private $finish = false;
        
        public function __construct(){
            $this->current = new ForenoonState();
        }
        
        public function __get($Hour){
            return $this->$Hour;
        }
        
        public function __set($param,$val){
            $this->$param = $val;
        
        }
        
        public function SetState($s){
            $this->current = $s;
        }
        
        public function WriteProgram(){
            $this->current->WriteProgram($this);
        }
    }
    
    
    //客户端代码
    //紧急项目
    $work = new Work();
    $work->Hour = 9;
    $work->WriteProgram();
    $work->Hour = 15;
    $work->WriteProgram();
?>

大话设计模式之----状态模式

时间: 2024-10-09 07:55:37

大话设计模式之----状态模式的相关文章

大话设计模式_状态模式(Java代码)

状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 简单描述:一个Context类(存有一个抽象状态State引用),调用状态类的方法.State的具体类方法中会判断Context类的状态(如时间),满足一个状态则执行相应动作,否则把Context的State引用指向下一个状态类,由下一个状态类决定相应行为 大话设计模式中的截图: 例子代码: Work类(Context): 1 package com.longsheng.state; 2 3 public cla

&lt;十二&gt;读&lt;&lt;大话设计模式&gt;&gt;之状态模式

对于状态模式,<<大话设计模式>>是以人从上班到下班到加班的状态来展开讲述的.状态模式其实就是某一个对象在某个过程或者时间的一个状态记录,但是这个状态的顺序不能发生变化,在程序设计方面可能要比其他模式稍微复杂点,请待我慢慢将来. 本人喜欢用代码来形象的讲述原理,可能是因为对单纯的看些理论的书有些反感或者无趣吧,我希望以后的教育也如此,要不大家都不高考了...嘿嘿说多了 状态模式:当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 还是代码呈现吧,概念太抽象了.

笔记-大话设计模式-16 状态模式

状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化. 消除庞大的条件分支语句.状态模式通过把各种状态转移逻辑分布到State的子类之间,来减少相互间的依赖. 当一个对象的行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了. Demo1: abstract class

大话设计模式笔记 状态模式(不推荐) 适配器模式

状态模式(State),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化. 说实话这模式用起来好费劲,起到的作用也不是很大. 适配器(Adapter),将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作. 如果能先事先预防接口不同的问题,不匹配问题就不会发生; 在

大话设计模式之状态模式

1:状态模式的类图设计 类图地解释: State接口和Context类地关系:其中State接口中依赖于Context因为State中Handle方法要使Context的状态变化,所以其形参为Context类型,变化的实质就是内部State引用指向不同对象的变化.而Context类内部有一个State接口的引用,因为Context中状态变化的实质就是State引用指向不同的State对象. State接口:所有状态类都要实现该接口,这样子才能统一使用,并且对于Context来说不需要认识不同的状

大话设计模式_备忘录模式(Java代码)

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将该对象恢复到原先保存的状态. 简单描述:一个Memento类,代表Originator中要备份的属性.Originator负责生成备份和还原备份,CareTaker负责存储备份 大话设计模式中的截图: 例子代码: Memento类: 1 package com.longsheng.memento; 2 3 public class Memento { 4 5 private String sta

设计模式之状态模式(State)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

【大话设计模式】—— 模板方法模式

一.概念 上一篇文章刚刚讲了[大话设计模式]-- 原型模式,原型模式主要是通过Clone()方法,创建新的对象,免去了初始化的过程.模板方法模式也特别会"偷工减料",把不变的行为搬移到超类,去除子类中的重复代码,将代码的复用优势展现的淋漓尽致.它为我们提供了特定的结构和样式,我们只需关心填充数据内容就好,省心啊- 下面让我们来看一下它的准确定义: 模板方法(TemplateMethod)模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构

【大话设计模式】——代理模式

对于面向对象的程序设计语言而言,继承和多态是两个最基本的概念.Hibernate 的继承映射可以理解持久化类之间的继承关系.例如:人和学生之间的关系.学生继承了人,可以认为学生是一个特殊的人,如果对人进行查询,学生的实例也将被得到. Hibernate支持三种继承映射策略: 使用 subclass 进行映射:将域模型中的每一个实体对象映射到一个独立的表中,也就是说不用在关系数据模型中考虑域模型中的继承关系和多态. 使用 joined-subclass 进行映射: 对于继承关系中的子类使用同一个表