策略模式

简介:

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

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

相关文章
|
4月前
|
算法 数据安全/隐私保护
行为型 策略模式
行为型 策略模式
18 1
|
8月前
|
设计模式 算法 Java
什么场景要使用策略模式,什么场景不能使用?
如果,让我来设计,我最先想到的就是策略模式。另外,我把往期面试题解析的配套文档我已经准备好,想获得的可以在我的煮叶简介中找到。那么什么场景要使用策略模式,什么场景又不应该使用策略模式呢?我们可以先来看官方对策略模式的定义。
108 0
|
8月前
|
前端开发
策略模式
策略模式
55 0
|
9月前
|
设计模式 算法
策略模式详细介绍
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列的算法,并将每个算法封装到具有共同接口的独立类中,使得它们可以互相替换。策略模式可以让算法的变化独立于使用它的客户端。
94 0
|
9月前
|
算法 测试技术 C#
C#策略模式
C#策略模式
40 0
|
10月前
|
设计模式 前端开发
关于策略模式我所知道的
关于策略模式我所知道的
56 0
|
10月前
|
算法 程序员 开发工具
简单说说我对策略模式的了解
简单说说我对策略模式的了解
62 0
|
设计模式 算法
我学会了,策略模式
策略模式属于行为型模式,这个类型的设计模式总结出了 类、对象之间的经典交互方式,将类、对象的行为和使用解耦了,花式的去使用对象的行为来完成特定场景下的功能。
96 0
我学会了,策略模式

热门文章

最新文章