个人理解:
核心是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)
本文通过年龄状态和时间状态两个实例,详细介绍了状态模式的实现方法。使用C#和Python两种语言展示了如何通过状态对象来更新Context中的当前状态。
1362

被折叠的 条评论
为什么被折叠?



