重温设计模式 --- 状态模式

2023-10-22 16:43:45 浏览数 (1)

引言

状态模式是一种行为型设计模式,它允许对象在其内部状态改变时改变其行为。该模式将对象的行为与其状态分离,并将每种状态封装在不同的类中。这样,对象可以在运行时根据其状态选择不同的行为,而不必在代码中使用大量的条件语句来处理这些状态。

状态模式的优点是它将与特定状态相关的行为局部化并且将状态转换显式化,从而简化了代码,并且使得代码更加容易扩展和维护。但是,使用状态模式可能会增加类的数量,从而增加代码的复杂度。

下面用C#写一个示例,用于更好地说明状态模式的实现。

假设有一个交通信号灯系统,其中包括红灯、黄灯和绿灯三种状态。当交通信号灯处于不同状态时,将显示不同的颜色,并且行人和车辆在这些状态下必须采取不同的行动。这可以使用状态模式来实现。

首先,我们需要定义状态接口,它包含了所有状态必须实现的方法:

定义状态接口

定义状态接口,它包含了所有状态必须实现的方法:

代码语言:javascript复制
public  interface  ITrafficLightState
{
    void Change(TrafficLight trafficLight);
    
    void ReportState();
}

定义状态实现

实现红灯、黄灯和绿灯状态的具体实现:

代码语言:javascript复制
public  class  RedLightState : ITrafficLightState
{
    public void Change(TrafficLight trafficLight)
    {
        trafficLight.State = new GreenLightState();
    }

    public void ReportState()
    {
        Console.WriteLine("现在是红灯");
    }
}

public  class  YellowLightState : ITrafficLightState
{
    public void Change(TrafficLight trafficLight)
    {
        trafficLight.State = new RedLightState();
    }

    public void ReportState()
    {
        Console.WriteLine("现在是黄灯");
    }
}

public  class  GreenLightState : ITrafficLightState
{
    public void Change(TrafficLight trafficLight)
    {
        trafficLight.State = new YellowLightState();
    }

    public void ReportState()
    {
        Console.WriteLine("现在是绿灯");
    }
}

在上述实现中,每个状态都实现了ITrafficLightState接口,并在Change方法中指定了下一个状态,以及在ReportState方法中输出当前状态。

定义状态主对象

创建表示交通信号灯的主要对象,并将初始状态设置为红灯:

代码语言:javascript复制
public  class  TrafficLight
{
    public ITrafficLightState State { get; set; }

    public TrafficLight()
    {
        State = new RedLightState();
    }

    public void ChangeState()
    {
        State.Change(this);
    }

    public void ReportState()
    {
        State.ReportState();
    }
}

测试红绿灯状态变化:

代码语言:javascript复制
TrafficLight trafficLight = new TrafficLight();
trafficLight.ReportState();  // 输出 "现在是红灯"

trafficLight.ChangeState();
trafficLight.ReportState();  // 输出 "现在是绿灯"

trafficLight.ChangeState();
trafficLight.ReportState();  // 输出 "现在是黄灯"

trafficLight.ChangeState();
trafficLight.ReportState();  // 输出 "现在是红灯"

在这个示例中,我们首先创建了一个TrafficLight对象,并将其初始状态设置为红灯。然后,我们调用ReportState方法,该方法将输出当前状态。接下来,我们多次调用ChangeState方法,该方法将改变当前状态,并再次调用ReportState方法以输出新状态。可以看到信号灯在不同的状态下采取了不同的行动。

结论

状态模式允许对象在不同的状态下采取不同的行动,并且在状态变化时能够自动转换行为。这种灵活性使得状态模式在许多场景中非常有用,如自动售货机、游戏中的角色状态等。

然而,状态模式也有一些缺点。一个明显的缺点是,如果我们有许多状态,我们需要实现许多具体的状态类,这可能导致代码变得复杂和难以维护。此外,当状态变化不频繁时,状态模式可能过于繁琐,并且可能不值得实现。我们需要根据具体情况权衡其优缺点,以确保在实现时能够最大程度地利用其优势并避免其缺点。

0 人点赞