设计模式-策略模式(Strategy)

简介:

定义了算法家族,分别封装起来,能够让他们之间相互替换。此模式能够让算法的变化,不会影响到使用算法的客户。【行为型模式】算法


结构图:


优势:

  1. 策略模式是一种定义一系列算法的方法,从概念上来看,这些算法都是完成相同的工做,只是实现不一样。它能够以相同的方式调用全部的算法,减小了各类算法类与调用算法类之间的耦合性 ;
  2. 策略模式简化了单元测试,由于每一种算法都有本身的类,能够经过调用本身的接口单独测试;
  3. 策略模式的Strategy类层次为Context定义了一系列可供重用的算法或行为。继承有助于析取出这些算法中的公共功能。

缺点:

  1. 全部策略类都须要对外暴露;
  2. 策略类一多,就很难维护。

应用场景:

须要在不一样时间应用不一样的业务规则时,就能够使用策略模式处理这种变化的可能性。ide


注意事项:

  1. 在基本策略模式中,选择所用具体实现的职责是在客户端实现,能够专有Context类型(可见示例2);
  2. 所用策略都要实现同一接口。

示例:

1.结构类图的实现:单元测试

Strategy类,定义全部支持的算法的公共接口;测试

ConcreteStrategy类,封装了具体的算法或行为,继承于Strategythis

    /// <summary>
    /// 策略类
    /// </summary>
    public abstract class Strategy
    {
        /// <summary>
        /// 算法接口
        /// </summary>
        public abstract void AlgorithmInterface();
    }

    public class ConcreteStrategyA : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("我是策略算法A");
        }
    }

    public class ConcreteStrategyB : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("我是策略算法B");
        }
    }

    public class ConcreteStrategyC : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("我是策略算法C");
        }
    }

Context类,用一个ConcreteStrategy来配置,维护一个Strategy对象的引用spa

    /// <summary>
    /// 上下文
    /// </summary>
    public class Context
    {
        private Strategy strategy;

        public Context(Strategy strategy)
        {
            this.strategy = strategy;
        }
        /// <summary>
        /// 上下文接口
        /// </summary>
        public void ContextInterface()
        {
            strategy.AlgorithmInterface();
        }
    }

客户端3d

 Context context = new Context(new ConcreteStrategyA());
 context.ContextInterface();
 context = new Context(new ConcreteStrategyB());
 context.ContextInterface();
 context = new Context(new ConcreteStrategyC());
 context.ContextInterface();

结果代理

2.策略模式之撩妹2code

话说上次撩妹(代理模式)失败后,痛定思痛,寻求新的方法。获得一个智囊【Context】,告诉我如何在不一样阶段使用不一样的撩妹技巧【Strategy】。对象

撩妹策略

    /// <summary>
    /// 撩妹策略接口
    /// </summary>
    public interface IChaseGirlStrategy
    {
        void ChaseGirl();
    }
    /// <summary>
    /// 相见时的策略
    /// </summary>
    public class XiangjianStrategy : IChaseGirlStrategy
    {
        public void ChaseGirl()
        {
            Console.WriteLine("1.了解女孩儿的爱好");
            Console.WriteLine("2.多和女孩聊天");
        }
    }
    /// <summary>
    /// 相识时的策略
    /// </summary>
    public class XiangshiStrategy : IChaseGirlStrategy
    {
        public void ChaseGirl()
        {
            Console.WriteLine("1.约女孩儿看电影");
            Console.WriteLine("2.约女孩儿吃饭");
        }
    }
    /// <summary>
    /// 相知时的策略
    /// </summary>
    public class XiangzhiStrategy : IChaseGirlStrategy
    {
        public void ChaseGirl()
        {
            Console.WriteLine("1.多送小礼物");
            Console.WriteLine("2.相约出去旅游");
        }
    }

智囊

    /// <summary>
    /// 智囊
    /// </summary>
    public class BigThink
    {
        private IChaseGirlStrategy strategy;
        /// <summary>
        /// 策略模式和工厂模式结合
        /// </summary>
        /// <param name="type"></param>
        public BigThink(string type)
        {
            switch (type)
            {
                case "1": strategy = new XiangjianStrategy(); break;
                case "2": strategy = new XiangshiStrategy(); break;
                case "3": strategy = new XiangzhiStrategy(); break;
            }
        }
        /// <summary>
        /// 获取策略
        /// </summary>
        public void GetStrategy()
        {
            strategy.ChaseGirl();
        }
    }

客户端

string[] flags = { "1", "2", "3" };
Console.WriteLine("*************************************");
Console.WriteLine("请选择所处阶段,获取相应策略");
Console.WriteLine("【1】:相见时...");
Console.WriteLine("【2】:相识时...");
Console.WriteLine("【3】:相知时...");
Console.WriteLine("*************************************");
bool isRun = true;
do
{
    var flag = Console.ReadLine();
    if (flags.Contains(flag))
    {
        BigThink bigThink = new BigThink(flag);
        bigThink.GetStrategy();
        Console.WriteLine(".............................");
        Console.WriteLine("按上述指令以外按键退出...");
    }
    else
    {
        isRun = false;
    }

} while (isRun);

结果

请多多指教~

相关文章
相关标签/搜索