.Net 设计模式(二) 策略模式

策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。通过定义一个算法家族并封装在不同的策略类中,使得在不修改原有系统的情况下,可以灵活地切换不同的算法实现。本文通过一个制作番茄炒蛋的例子展示了策略模式的结构和工作原理,包括策略控制类(Context)、抽象策略接口(Strategy)以及具体策略的实现。使用策略模式可以避免大量if-else语句,提高代码可读性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

策略模式(Strategy):它定义了算法家族,分别封装起来,让它们之间可以互相替换

结构图

在这里插入图片描述
结构组成

  1. 策略控制(Context):控制了具体的算法使用,以及负责客户端与算法之间的数据交互
  2. 抽象策略(Strategy):定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。
  3. 具体策略:实现Strategy的具体算法

代码实现

生活中有很多例子,每个人做菜的方式不同做出来的菜口味口感都会不同。

	/// <summary>
    /// 策略控制类---相当于Context
    /// </summary>
    public class CookContext : Disposable
    {
        internal ICookStrategy _cookStrategy;

        public CookContext(int cookMethod)
        {
            switch (cookMethod)
            {
                case 1:
                    _cookStrategy = new CookStrategy1();
                    break;
                case 2:
                    _cookStrategy = new CookStrategy2();
                    break;
                default:
                    break;
            }
        }

        public TomatoEgg Cook()
        {
            return _cookStrategy.Cook();
        }
    }

	/// <summary>
    /// 抽象策略----相当于Strategy
    /// </summary>
    internal interface ICookStrategy
    {
        TomatoEgg Cook();
    }

    /// <summary>
    /// 制作番茄炒蛋的方式1
    /// </summary>
	internal class CookStrategy1 : ICookStrategy
    {
        public TomatoEgg Cook()
        {
            var tomatoEgg = new TomatoEgg();
            tomatoEgg.Tomato = "带皮番茄";
            tomatoEgg.Egg = "普通鸡蛋";
            return tomatoEgg;
        }
    }

	 /// <summary>
    /// 制作番茄炒蛋的方式2
    /// </summary>
    internal class CookStrategy2 : ICookStrategy
    {
        public TomatoEgg Cook()
        {
            var tomatoEgg = new TomatoEgg();
            tomatoEgg.Tomato = "去皮番茄";
            tomatoEgg.Egg = "农家土鸡蛋";
            return tomatoEgg;
        }
    }


	// 调用
	 CookContext context;
     context = new CookContext(1);
     var tomatoEgg1 = context.Cook();
     tomatoEgg1.Eat();
     context = new CookContext(2);
     var tomatoEgg2 = context.Cook();
     tomatoEgg2.Eat();

优点与缺点

优点:

  1. 策略类之间可以自由切换,因为所有策略类都实现了的是一个接口
  2. 扩展更加方便,加入新的算法只需要新增加一个策略类,并且修改策略类算法时不会影响调用方面
  3. 避免了多重if else语句的出现

缺点:

  1. 调用方需要知道所有的策略类,才能自行决定调用哪个策略类

Demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值