状态模式之看尽人生百态

有人说“人的起点起初都是一样的,在后来的加加减减中,慢慢出现了差距……”人生是什么?人生如你脚下的路,如但丁在《神曲》里的一句话“在人生旅程的中途……”不论曾经做对了什么,做错了什么,用一颗心、一生情去坚定走你没走完的路。人生是什么?是一幅优美的画卷,是一段离奇的爱情故事,还是一曲悠悠的伤感乐曲……我无法形容人生是什么,为什么会有各式各样的人生经历,有人哭有人笑,有人淡然,有人超然,细看人间故事,品酸甜苦辣。

每个人的人生犹如一个个小小的圆圈,随着时间的推移,这个圆慢慢的慢慢的长大,圆里面是一个过程,纷繁复杂着那一段一段的经历。从童年开始,一直到老年落幕,我们都一直在人生的舞台上尽情演绎自己的故事。今天我们的设计模式就从人生开始说起,人生有着五个明确的阶段,从童年,少年,青年,中年,一直到老年落幕,也可以这么说,人的一生分为五个状态,宛如我们设计模式中的状态模式,首先我们来看一下状态模式的结构图:

以我们的人生为例,看看状态模式是如何活跃着我们人生的舞台:

首先抽象状态类-----抽象类 LifeState

    //定义一个抽象的LifeState类
    public abstract class LifeState
    {
        public abstract void ChangeLife(Life l);
    }

具体的人生阶段

    //童年阶段-ChildhoodState
    class ChildhoodState: LifeState
    {
        public override void ChangeLife(Life l)
        {
            Console.WriteLine("童年是一片无边无际的蓝天,包纳了无限的景象!");
            l.State= new JuvenileState();
        }
    }
    //少年阶段-JuvenileState
    class JuvenileState :LifeState
    {
        public override void ChangeLife(Life l)
        {
            Console .WriteLine("少年要用笑脸去追寻梦想,面对梦想,迎接梦想!");
            l.State= new YouthState();
        }
    }
    //青年阶段- YouthState
    class YouthState :LifeState
    {
        public override void ChangeLife(Life l)
        {
            Console.WriteLine("美丽的豆蔻年华,从青涩走向成熟!");
            l.State = new MidlifeState ();
        }
    }
    //中年阶段-MidlifeState
    class MidlifeState :LifeState
    {
        public override void  ChangeLife(Life l)
        {
            Console.WriteLine("中年的你,是否实现自己的愿望,满意的工作,幸福的家庭!");
            l.State= new ElderyState();
        }
    }  

    //老年阶段-ElderyState
    class ElderyState:LifeState
    {
        public override void ChangeLife(Life l)
        {
 	        Console .WriteLine ("最美不过夕阳红!");
        }
    }

人生类-----Life

    //定义一个人生类-Life
    public class Life
    {
        //初始化当前人生
        private LifeState state;
        public Life(LifeState state)
        {
            this.state = state;
        }  

        public LifeState State
        {
            get { return state; }
            set { state = value; }
        }  

        public void  ChangeLife() //方法名可以改变
        {
            state.ChangeLife(this);
        }
    }

客户端代码:

static void Main(string[] args)
        {
            Life life = new Life( new ChildhoodState());
            life.ChangeLife();
            life.ChangeLife();
            life.ChangeLife();
            life.ChangeLife();
            life.ChangeLife(); 

            Console.Read();
        }

运行结果如下:

状态模式主要解决的是当控制一个对象状态转化的条件表达式过于复杂时的情况,把状态的判断逻辑转移到表示不同状态的一系列类当中,可以把复杂的判断逻辑简化,总的来说就是当一个对象的内在状态改变时允许改变其行为,这个对象看起来是改变了其类。

在面向对象软件设计时,常常碰到某一个对象由于状态的不同而有不同的行为。如果用if else或是switch case等方法处理,对象操作及对象的状态就耦合在一起,碰到复杂的情况就会造成代码结构的混乱。在这种情况下,就可以使用状态模式来解决问题。

状态模式之看尽人生百态

时间: 2024-08-29 12:09:55

状态模式之看尽人生百态的相关文章

从状态模式看“大神”和“菜鸟”的区别

<大话设计模式>中讲状态模式这一节名字叫做"无尽加班何时休-状态模式".菜鸟由于编程经验不足,解决问题的能力不够而不得不牺牲时间去不断的写代码结果还是反复出错.而大神每次都能深入到问题的根源运用自己的思想去写代码,每个问题都完美的解决. 加班的菜鸟一天各个时间段状态都不一样,从开始的精神百倍到越来越疲惫.自己写出的代码不断带来问题. 代码是程序员思维智慧的结晶,菜鸟"程序员没有将自己的思维融入代码写出来的是这样的: class Program { static v

从状态模式看“大神”和“菜鸟”的差别

<大话设计模式>中讲状态模式这一节名字叫做"无尽加班何时休-状态模式".菜鸟因为编程经验不足,解决这个问题的能力不够而不得不牺牲时间去不断的写代码结果还是重复出错. 而大神每次都能深入到问题的根源运用自己的思想去写代码.每一个问题都完美的解决. 加班的菜鸟一天各个时间段状态都不一样.从開始的精神百倍到越来越疲惫. 自己写出的代码不断带来问题. 代码是程序猿思维智慧的结晶,菜鸟"程序猿没有将自己的思维融入代码写出来的是这种: class Program { stat

【设计模式】 模式PK:策略模式VS状态模式

1.概述 行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下. 策略模式(左)和状态模式(右)的通用类图. 两个类图非常相似,都是通过Context类封装一个具体的行为,都提供了一个封装的方法,是高扩展性的设计模式.但根据两者的定义,我们发现两者的区别还是很明显的:策略模式封装的是不同的算法,算法之间没有交互,以达到算法可以自由切换的目的:而状态模式封装的是不同的状态,以达到状态切换行为随之发生改变的目的.这两种模式虽然都有变换的行为,但

【设计模式】策略模式 vs 状态模式

相同点:同为行为型策略模式,均通过context类封装一个具体行为,都提供一个封装的方法: 不同点: 1)从定义看:目的不同 策略模式:封装不同的算法,算法间没有交互,达到算法可以自由互换目的:  实际样例:人生不同阶段的主要工作:儿童->玩耍.成年->工作.比如加密算法的互换(AES->RSA) 状态模式:封装不同的状态,达到状态切换后行为随之发生改变的目的.      实际样例:从儿童 切换 成年,因为状态的变化(儿童到成年),主要工作内容发生了改变. 2)具体场景代码比对 场景:人

大话设计模式读书笔记--12.状态模式

定义 状态模式定义: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来改变了其类 消除庞大的条件分支,将特定状态的行为放入一个对象中 生活中:开灯和关灯是两个状态 模式结构 Context: 上下文环境,维护一个状态实例,定义当前的状态 State: 抽象状态类,定义一个接口,封装与Context的一个特定状态相关的行为 ConcreteState:具体状态.实现Context的一个特定状态相关的行为 代码实现 场景: 12店之前是休闲状态, 之后是忙碌状态 点击下载代码 特点及使用场

设计模式整理_状态模式

状态模式允许对象在内部状态改变的时候,改变它的行为,对象看起来好像修改了它的类.因为这个模式将状态封装成为独立的类,并将动作委托到代表当前状态的对象,而行为会随着内部状态而改变. 在状态模式中,Context内部持有状态,State接口定义了一个所有具体状态的共同接口,任何状态都实现这个相同的接口,这样一来,各个状态可以互相替换.具体状态实现状态接口,所以当Context改变状态的时候,行为也跟着改变.而不管在什么时候,只要有人调用Context的具体方法,它就会用来委托状态处理,下面用具体事例

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 责任链模式概念和例子 使用的条件 和状态模式的比较分析 责任链的优缺点 纯的责任链和不纯的责任链 javax.servlet.Filter#doFilter()方法源码分析 基于AOP思想,模拟一个拦截器 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂业务逻辑判断的,那么他们有什么不同呢?回忆状态模式——状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象

23状态模式

 1状态模式的核心内容是: A:状态类 B:工作类 2状态模式的作用:通过状态值自动跳转到要执行的类. 3状态模式具体描述 状态模式:状态模式允许一个对象在其内部状态改变的时候改变行为. 这个对象看上去象是改变了它的类一样.状态模式把所研究的对象的行 为包装在不同的状态对象里,每一个状态对象都属于一个抽象状态类的 一个子类.状态模式的意图是让一个对象在其内部状态改变的时候, 其行为也随之改变.状态模式需要对每一个系统可能取得的状态创立一个状态类的 子类.当系统的状态变化时,系统便改变所选的子

学习日记之状态模式和Effective C++

状态模式(State):当一个对象内在状态改变时,允许改变其行为,这个对象看起来像是改变了其类. (1),状态模式主要负责解决的是当控制一个对象转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类中,可以把复杂的判断逻辑简化. (2),状态模式的好处是将与特定状态相关的行为局部化,并且将不同状态的行为分割开来. (3),将特定的状态相关的行为都放入一个对象中,由于所有与状态相关的代码都存在于某个ConcreteState中,所以通过定义新的子类可以很容易地增加新的状态和