设计模式之行为模式---状态模式

一、状态设计模式的特点

当一个对象内部具允许有多个状态改变时,我们将不同的状态提取出来作为一个单独的类来描述一个状态,这样可以很容易的扩展对象,使其具有更多的状态表达,而不会影响到对象本身。

一个状态模式的结构图:

State作为一个抽象接口类,向外界提供一个对象,而派生类继承自State实现接口作为不同的状态表示。

Context是一个状态调配类,它根据客户端传递过来的指令判断对象需要执行那种状态,而指定创建那个子类的实例接口。从而实现状态的改变。

二、状态模式的实现

1、在实际生活中我们可以我们的工作看成一个状态模式,在不同的时间段的工作的状态不同。

2、状态模式的代码实现

using System;
/*
zhong de zhuang tai jie kou
*/
abstract class  State
{
    public abstract void Handle (Context context);
}


class ConcreteStateA :State
{
    public override void Handle (Context context)
    {
        if (context.Hourr < 12) {

            Console.WriteLine ("Is work");
        } else {
            context.Request (new ConcreteStateB ());
            context.WriteProgran ();
        }


    }

}

class ConcreteStateB :State
{
    public override void Handle(Context context)
    {
        if (context.Hourr < 13) {
            Console.WriteLine ("Lunch take a nap.");
        } else {
            context.Request (new ConcreteStateC ());
            context.WriteProgran ();
        }
    }
}

class ConcreteStateC :State
{
    public override void Handle(Context context)
    {
        Console.WriteLine ("Home from work");
    }
}

//zhuang tai tiao pei
class Context
{
    private State state;
    //chu shi gong zuo zhuang tai
    public Context()
    {
        state = new ConcreteStateA ();
    }


    /*ji lu shi jian de zhuan huan*/
    private double hourr;
    public double Hourr
    {
        get{ return hourr;}
        set{ hourr = value;}
    }

    //geng gai dang qian zhuang tai
    public void Request(State se)
    {
        state = se;
    }

    public void WriteProgran()
    {
        state.Handle (this);
    }
}

class WinMain
{
    public  static void Main(string[] args)
    {
        Context c = new Context ();
        c.Hourr = 9;
        c.WriteProgran ();

        c.Hourr = 12;
        c.WriteProgran ();

        c.Hourr = 17;
        c.WriteProgran ();

        Console.ReadKey ();
    }
}

运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值