状态模式(State)

本文通过年龄状态和时间状态两个实例,详细介绍了状态模式的实现方法。使用C#和Python两种语言展示了如何通过状态对象来更新Context中的当前状态。

个人理解:

核心是Context维护一个当前状态,并在Invoke状态方法时,将context维护的当前状态更新至下一状态


UML类图:

代码实现:

using System;

namespace DecoratorMode
{
    class Program
    {
        static void Main(string[] args)
        {
            new AgeContext().PrintAgeStatus(25);
            new AgeContext().PrintAgeStatus(100);
        }
    }

    public class AgeContext
    {
        public Age CurrentAge { get; set; }
        public void PrintAgeStatus(int age)
        {
            if (CurrentAge == null)
                CurrentAge = new ChildAge();

            CurrentAge.PrintAgeStatus(this, age);
        }
    }

    public abstract class Age 
    {
        public abstract void PrintAgeStatus(AgeContext context, int age);
    }

    public class ChildAge : Age
    {
        public override void PrintAgeStatus(AgeContext context, int age)
        {
            if (age <= 20)
                Console.WriteLine("Little Child...");
            else
            {
                context.CurrentAge = new YounthAge(); //这里是状态模式的核心,更新context至下一个状态
                context.PrintAgeStatus(age);
            }
        }
    }

    public class YounthAge : Age
    {
        public override void PrintAgeStatus(AgeContext context, int age)
        {
            if (age <= 30)
                Console.WriteLine("Younth...");
            else
            {
                context.CurrentAge = new OldAge(); //这里是状态模式的核心,更新context至下一个状态
                context.PrintAgeStatus(age);
            }
        }
    }

    public class OldAge : Age
    {
        public override void PrintAgeStatus(AgeContext context, int age)
        {
            Console.WriteLine("Old...");
        }
    }
}

Python代码实现

class Time(object):
    hour = 0

    def GetCurrentTime(self, hour):
        self.hour = hour
        return self
    def JudgeTimeConcreteType(self, hour):
        raise NotImplementedError("abstract method")

class Morning(Time):
    def JudgeTimeConcreteType(self, hour):
        if hour <= 11 and hour >= 6:
            print("current is morning")
            return self.GetCurrentTime(hour)
        else:
            return Noon().JudgeTimeConcreteType(hour)

class Noon(Time):
    def JudgeTimeConcreteType(self, hour):
        if hour > 11 and hour < 13:
            print("current is noon")
            return self.GetCurrentTime(hour)
        else:
            return AfterNoon().JudgeTimeConcreteType(hour)

class AfterNoon(Time):
    def JudgeTimeConcreteType(self, hour):
        if hour >= 13 and hour <= 18:
            print("current is afternoon")
            return self.GetCurrentTime(hour)
        else:
            return Night().JudgeTimeConcreteType(hour)

class Night(Time):
    def JudgeTimeConcreteType(self, hour):
        if hour > 18 or hour < 6:
            print("current is night")
            return self.GetCurrentTime(hour)
        else:
            return None

class TimeContext(object):
    CurrentTime = None
    def JudgeTime(self, hour):
        if self.CurrentTime == None:
            self.CurrentTime = Morning()
        self.CurrentTime = self.CurrentTime.JudgeTimeConcreteType(hour)

if __name__ == "__main__":
    timeContext=TimeContext()
    timeContext.JudgeTime(16)
    print(timeContext.CurrentTime.hour)
    


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值