C# 一分钟浅谈:策略模式与状态模式
创作时间:
作者:
@小白创作中心
C# 一分钟浅谈:策略模式与状态模式
引用
1
来源
1.
https://cloud.tencent.com/developer/article/2461552
策略模式和状态模式是面向对象编程中两种重要的行为型设计模式。策略模式用于封装算法,使其可以相互替换;状态模式则允许对象根据其内部状态改变行为。本文通过C#代码示例,详细介绍了这两种模式的定义、应用场景、实现方法以及常见问题的解决方案。
策略模式
定义
策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。
应用场景
- 当一个类的行为或其算法可以在运行时更改时。
- 当系统中存在大量类似的类,而它们之间的区别仅在于它们的行为时。
示例代码
假设我们有一个简单的文本处理应用,需要支持多种文本格式化方式。
// 抽象策略
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(); // 输出: 订单已发货,无法支付
常见问题及避免方法
- 状态爆炸:随着状态数量的增加,维护和管理状态变得越来越困难。
- 过度设计:对于简单的问题,使用状态模式可能会引入不必要的复杂性。
- 避免方法:在设计时评估状态的数量和复杂性,确保状态模式的使用是合理的。可以通过状态机或其他更简单的机制来管理状态。
总结
策略模式和状态模式都是行为型设计模式,它们分别用于处理算法的变化和对象状态的变化。通过合理使用这两种模式,可以提高代码的灵活性和可维护性。然而,过度使用设计模式也会带来复杂性和性能问题,因此在实际开发中需要权衡利弊,选择合适的设计方案。
热门推荐
《怎么读》:探索阅读的意义、方法与人生的深刻关系
拔牙对好牙有影响吗?揭开拔牙后牙齿松动的真相
药吃不对很伤肝,做好四点预防药物性肝损伤!
中国老一辈歌唱家回顾:郎毓秀
《赤壁赋》文言文注释 原文及翻译
《赤壁赋》古文注释 创作背景是什么
经历两次改名风波,从此再无“黑人牙膏”,曾是国货的它太难了
外地人在上海退休条件:了解退休政策和要求
放射性药物:核技术在医疗领域的精准应用
历代亲王最强封号秦王和晋王,谁才是真正排在第一的封号
明清皇子封号差异:一朝封王,一朝赐爵
欧洲的中国移民画家是谁?揭开艺术与文化的交融
不是“安全型依恋”,就没法好好恋爱吗?
法院实现担保物权审查标准详解
CCAA注册审核员考试2025最新政策解读|报名条件+考试时间+备考攻略
樱花几月开花?花期多长?带你了解樱花的美丽世界
《建筑评论》AR系列奖项专题:公共性、前瞻性、再生力、居住创新与新锐崛起
春江潮水连海平——探索古诗中的意境与人生哲理
脂肪测定仪:准确测量脂肪含量的设备【科普】
“小积分”激发乡村治理新活力,绘就和美乡村“共治画卷”
补牙和装牙套的时间需要多久?详细了解过程与所需时长。
《论语》中,孔子怎么评价历史人物?
要求提前退休可以申请劳动仲裁吗
2025年将全面取消高考复读?
7月海南旅游全攻略:行前准备、必带物品清单及游玩指南
昆明特色美食排行榜前十名,哪道佳肴能征服你的味蕾?
山东腾飞:为什么交流电更易于传输远距离的电力呢?
交流电和直流电相比,它们各自的优缺点是什么?
2025定向士官学校招生全攻略:分数线预测、报考条件及录取流程详解
生活管理项目分类标准有哪些