策略模式

经典的策略模式如下图所示:

image

让我解释一下这幅图的含义,IContext是上下文的接口类,IStrategy是策略的接口,IStrategy依赖于IContext,也就是IContext里面存有一个IStrategy的策略字段。

其实策略模式说白了,就像诸葛亮给刘备的锦囊妙计一样,遇到一种具体的情况,采取一种相应的策略。也就像我们平时会观察天气,根据今天有没有下雨,选择要不要打伞,下雨的话,那么打伞;不下雨就不打伞。

下面我们用代码来演示一下经典的策略模式。我们将要做的是,从一个数组中提取一个值,这个值的提取要根据用户的选择,也就是我们要根据用户的选择提取对应的值。假设用户有三种选择,选最大值,最小值,选第一个值。

1、首先我们要实现公共接口

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BangWorks.PractcalPattern.StategyPattern.Classic
{
    interface IStrategy
    {
        /// <summary>
        /// 按照算法的要求,将数据提取出来
        /// </summary>
        /// <param name="Data">数组</param>
        /// <returns></returns>
        int PickUp(int[] Data);
    }
    interface IContext
    {
        IStrategy Strategy { get; set; }
        int GetData(int[] data);
        
    }
}
复制代码

2、实现相应的策略类

复制代码
/// <summary>
        /// 取最大值
        /// </summary>
        class DescentSortStrategy:IStrategy
        {
            int IStrategy.PickUp(int[] Data)
            {   Array.Sort<int>(Data);
                return Data[Data.Length-1];
              
            }
        }
        /// <summary>
        /// 取第一个值
        /// </summary>
        class FirstDataStrategy:IStrategy
        {

            public int PickUp(int[] Data)
            {
                return Data[0];
            }
        }
        /// <summary>
        /// 取最小值
        /// </summary>
        class AscentStrategy:IStrategy
        {
            int IStrategy.PickUp(int[] Data)
            {
                Array.Sort<int>(Data);
                return Data[0];
            }
        }
复制代码

3、最后,我们利用策略模式来切换策略

复制代码
/// <summary>
        ///GetData 的测试
        ///</summary>
        [TestMethod()]
        public void GetDataTest()
        {
            IStrategy mStrategy = new FirstDataStrategy();
            
            IContext target = CreateIContext(); 
            int[] data = new int[]{7,2,5,8,0,1};

            //切换成取第一个值的
            target.Strategy = mStrategy;
            int expected = 7; 
            int actual;
            actual = target.GetData(data);
            Assert.AreEqual(expected, actual);
            //切换成取最小值的
            target.Strategy = new AscentStrategy();
            expected = 0; 
            actual = target.GetData(data);
            Assert.AreEqual(expected, actual);

            //切换成取最大值的
            target.Strategy = new DescentSortStrategy();
            expected = 8;
            actual = target.GetData(data);
            Assert.AreEqual(expected, actual);
        }
复制代码

最后附上完整的单元测试类

  完整策略模式单元测试类

 本文转自陈哈哈博客园博客,原文链接http://www.cnblogs.com/kissazi2/p/3285395.html如需转载请自行联系原作者


kissazi2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值