策略模式架构设计及组件职责
- 抽象策略接口(IPromotionStrategy):定义促销策略的公共方法,所有具体的促销策略都要实现这个接口。其职责是为不同的促销策略提供统一的抽象,使得客户端可以以一致的方式调用不同的促销策略。
- 具体策略类(如FullReduceStrategy、DiscountStrategy、GiftStrategy):实现抽象策略接口中定义的方法,具体实现满减、打折、赠品等不同的促销逻辑。每个具体策略类负责实现特定的促销算法。
- 上下文类(PromotionContext):持有一个抽象策略接口的引用,通过构造函数或属性注入具体的策略对象。其职责是将客户端的请求委托给具体的策略对象来处理,隔离客户端与具体策略实现的耦合。
关键C#代码示例
// 抽象策略接口
public interface IPromotionStrategy
{
void ApplyPromotion();
}
// 满减策略具体类
public class FullReduceStrategy : IPromotionStrategy
{
public void ApplyPromotion()
{
Console.WriteLine("应用满减促销策略");
}
}
// 打折策略具体类
public class DiscountStrategy : IPromotionStrategy
{
public void ApplyPromotion()
{
Console.WriteLine("应用打折促销策略");
}
}
// 赠品策略具体类
public class GiftStrategy : IPromotionStrategy
{
public void ApplyPromotion()
{
Console.WriteLine("应用赠品促销策略");
}
}
// 上下文类
public class PromotionContext
{
private IPromotionStrategy _promotionStrategy;
public PromotionContext(IPromotionStrategy promotionStrategy)
{
_promotionStrategy = promotionStrategy;
}
public void ExecutePromotion()
{
_promotionStrategy.ApplyPromotion();
}
}
使用示例
class Program
{
static void Main()
{
PromotionContext promotionContext = new PromotionContext(new FullReduceStrategy());
promotionContext.ExecutePromotion();
promotionContext = new PromotionContext(new DiscountStrategy());
promotionContext.ExecutePromotion();
promotionContext = new PromotionContext(new GiftStrategy());
promotionContext.ExecutePromotion();
}
}
策略模式相比传统条件判断方式的优势
- 可维护性:传统条件判断方式中,促销逻辑都写在一个大的条件语句中,当新增或修改一种促销策略时,需要在该条件语句中进行修改,容易导致代码混乱且难以维护。而策略模式将每种促销策略封装在单独的类中,新增或修改策略只需修改对应的具体策略类,不影响其他代码。
- 可扩展性:策略模式使得新增促销策略变得非常容易,只需要创建一个新的具体策略类实现抽象策略接口即可,不需要修改现有的条件判断逻辑。而传统条件判断方式需要在原有的庞大条件语句中添加新的分支,增加了出错的风险。
- 代码复用:不同的促销策略类可以在不同的地方复用,而传统条件判断方式中,促销逻辑紧密耦合在条件语句中,难以复用。
- 符合开闭原则:策略模式符合开闭原则,即对扩展开放,对修改关闭。可以在不修改现有代码的情况下添加新的促销策略,而传统条件判断方式每次新增策略都需要修改条件判断代码。