C# 一分钟浅谈:策略模式与状态模式

简介: 【10月更文挑战第13天】本文介绍了两种常见的行为型设计模式:策略模式和状态模式。策略模式通过封装一系列算法并使其可互换,实现算法的灵活变化;状态模式则通过改变对象的内部状态来改变其行为。文章通过C#代码示例详细说明了这两种模式的应用场景、常见问题及解决方法。

在面向对象编程中,设计模式是一种被广泛接受的解决特定问题的方法。本文将重点介绍两种常见的行为型设计模式——策略模式和状态模式,并通过C#代码示例来说明它们的应用场景、常见问题及如何避免这些错误。
image.png

策略模式

定义

策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。

应用场景

  • 当一个类的行为或其算法可以在运行时更改时。
  • 当系统中存在大量类似的类,而它们之间的区别仅在于它们的行为时。

示例代码

假设我们有一个简单的文本处理应用,需要支持多种文本格式化方式。

// 抽象策略
public interface IFormatter
{
   
    string Format(string text);
}

// 具体策略
public class UpperCaseFormatter : IFormatter
{
   
    public string Format(string text) => text.ToUpper();
}

public class LowerCaseFormatter : IFormatter
{
   
    public string Format(string text) => text.ToLower();
}

// 上下文
public class TextProcessor
{
   
    private IFormatter _formatter;

    public TextProcessor(IFormatter formatter)
    {
   
        _formatter = formatter;
    }

    public void SetFormatter(IFormatter formatter)
    {
   
        _formatter = formatter;
    }

    public string Process(string text)
    {
   
        return _formatter.Format(text);
    }
}

// 使用
var processor = new TextProcessor(new UpperCaseFormatter());
Console.WriteLine(processor.Process("hello world")); // 输出: HELLO WORLD

processor.SetFormatter(new LowerCaseFormatter());
Console.WriteLine(processor.Process("HELLO WORLD")); // 输出: hello world

常见问题及避免方法

  • 过度使用:策略模式适用于算法多变的情况,如果算法固定不变,使用策略模式会增加不必要的复杂性。
  • 性能问题:频繁更换策略可能会导致性能下降,特别是在高并发场景下。
  • 避免方法:在设计时评估算法变化的可能性,确保策略模式的使用是合理的。

状态模式

定义

状态模式允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

应用场景

  • 对象的行为依赖于其状态,并且必须在运行时根据状态进行改变。
  • 代码中包含大量的条件语句,这些条件语句依赖于对象的状态。

示例代码

假设我们有一个简单的订单处理系统,订单的状态可以是“待支付”、“已支付”、“已发货”等。

// 抽象状态
public abstract class OrderState
{
   
    protected OrderContext _context;

    public void SetContext(OrderContext context)
    {
   
        _context = context;
    }

    public abstract void Pay();
    public abstract void Ship();
}

// 具体状态
public class UnpaidState : OrderState
{
   
    public override void Pay()
    {
   
        Console.WriteLine("订单已支付");
        _context.SetState(new PaidState());
    }

    public override void Ship()
    {
   
        Console.WriteLine("无法发货,订单未支付");
    }
}

public class PaidState : OrderState
{
   
    public override void Pay()
    {
   
        Console.WriteLine("订单已支付,无需重复支付");
    }

    public override void Ship()
    {
   
        Console.WriteLine("订单已发货");
        _context.SetState(new ShippedState());
    }
}

public class ShippedState : OrderState
{
   
    public override void Pay()
    {
   
        Console.WriteLine("订单已发货,无法支付");
    }

    public override void Ship()
    {
   
        Console.WriteLine("订单已发货");
    }
}

// 上下文
public class OrderContext
{
   
    private OrderState _state;

    public OrderContext()
    {
   
        _state = new UnpaidState();
        _state.SetContext(this);
    }

    public void SetState(OrderState state)
    {
   
        _state = state;
        _state.SetContext(this);
    }

    public void Pay()
    {
   
        _state.Pay();
    }

    public void Ship()
    {
   
        _state.Ship();
    }
}

// 使用
var order = new OrderContext();
order.Pay(); // 输出: 订单已支付
order.Ship(); // 输出: 订单已发货
order.Pay(); // 输出: 订单已发货,无法支付

常见问题及避免方法

  • 状态爆炸:随着状态数量的增加,维护和管理状态变得越来越困难。
  • 过度设计:对于简单的问题,使用状态模式可能会引入不必要的复杂性。
  • 避免方法:在设计时评估状态的数量和复杂性,确保状态模式的使用是合理的。可以通过状态机或其他更简单的机制来管理状态。

总结

策略模式和状态模式都是行为型设计模式,它们分别用于处理算法的变化和对象状态的变化。通过合理使用这两种模式,可以提高代码的灵活性和可维护性。然而,过度使用设计模式也会带来复杂性和性能问题,因此在实际开发中需要权衡利弊,选择合适的设计方案。

目录
相关文章
|
2月前
|
设计模式 算法 C#
C#设计模式之策略模式
C#设计模式之策略模式
76 19
|
算法 测试技术 C#
C#策略模式
C#策略模式
67 0
|
设计模式 算法 C#
【设计模式】C#实现策略模式
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
|
算法 C#
商场促销-策略模式(和简单工厂模式很像的哇) C#
还是那几句话: 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现在,学习代表你的将来 废话不多说,直接进入正题: 首先按照大话设计模式的解释,在这里也总结下策略模式的概念:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化,不会影响到使用算...
1624 0
|
C#
C#设计模式之十八状态模式(State Pattern)【行为型】
原文:C#设计模式之十八状态模式(State Pattern)【行为型】 一、引言   今天我们开始讲“行为型”设计模式的第六个模式,该模式是【状态模式】,英文名称是:State Pattern。无论是现实世界,还是面向对象的OO世界,里面都有一个东西,那就是对象。
1630 0
|
算法 C# 容器
C#设计模式之十九策略模式(Stragety Pattern)【行为型】
原文:C#设计模式之十九策略模式(Stragety Pattern)【行为型】 一、引言   今天我们开始讲“行为型”设计模式的第七个模式,该模式是【策略模式】,英文名称是:Stragety Pattern。
1715 0
|
XML SQL C#
乐在其中设计模式(C#) - 状态模式(State Pattern)
原文:乐在其中设计模式(C#) - 状态模式(State Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 状态模式(State Pattern) 作者:webabcd 介绍 允许一个对象在其内部状态改变时改变它的行为。
773 0