美文网首页
(六)设计模式之策略模式

(六)设计模式之策略模式

作者: CrixalisAs | 来源:发表于2018-02-14 22:40 被阅读0次

    1. 概述

    (1)策略模式的功能

    策略模式的功能是把具体的算法实现,从具体的业务处理里面独立出来,把它们实现成为单独的算法类,从而形成一系列的算法,并让这些算法可以相互替换。

    策略模式的重心不是如何来实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活、具有更好的维护性和扩展性。

    (2)策略模式和if-else语句

    看了前面的示例,很多朋友会发现,每个策略算法具体实现的功能,就是原来在if-else结构中的具体实现。

    没错,其实多个if-elseif语句表达的就是一个平等的功能结构,你要么执行if,要不你就执行else,或者是elseif,这个时候,if块里面的实现和else块里面的实现从运行地位上来讲就是平等的。

    而策略模式就是把各个平等的具体实现封装到单独的策略实现类了,然后通过上下文来与具体的策略类进行交互。

    因此多个if-else语句可以考虑使用策略模式。

    (3)算法的平等性

    策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正是因为这个平等性,才能实现算法之间可以相互替换。

    所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。

    所以可以这样描述这一系列策略算法:策略算法是相同行为的不同实现。

    (4)谁来选择具体的策略算法

    在策略模式中,可以在两个地方来进行具体策略的选择。

    一个是在客户端,在使用上下文的时候,由客户端来选择具体的策略算法,然后把这个策略算法设置给上下文。前面的示例就是这种情况。

    还有一个是客户端不管,由上下文来选择具体的策略算法,这个在后面讲容错恢复的时候给大家演示一下。

    (5)Strategy的实现方式

    在前面的示例中,Strategy都是使用的接口来定义的,这也是常见的实现方式。但是如果多个算法具有公共功能的话,可以把Strategy实现成为抽象类,然后把多个算法的公共功能实现到Strategy里面。

    (6)运行时策略的唯一性

    运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态的在不同的策略实现中切换,但是同时只能使用一个。

    (7)增加新的策略

    在前面的示例里面,体会到了策略模式中切换算法的方便,但是增加一个新的算法会怎样呢?

    其实很简单,策略模式可以让你很灵活的扩展新的算法。具体的做法是:先写一个策略算法类来实现新的要求,然后在客户端使用的时候指定使用新的策略算法类就可以了。

    2. 结构

    3. 代码实现

    using UnityEngine;
    
    public class DM03Strategy:MonoBehaviour
    {
        void Start()
        {
            StrategyContext context=new StrategyContext();
            context.Strategy=new ConcreteStrategyA();
            context.Cal();
        }
    }
    
    public class StrategyContext
    {
        public IStrategy Strategy; 
        public void Cal()
        {
            Strategy.Cal();
        }
    }
    
    public interface IStrategy
    {
        void Cal();
    }
    
    public class ConcreteStrategyA : IStrategy
    {
        public void Cal()
        {
            Debug.Log("使用A策略计算");
        }
    }
    public class ConcreteStrategyB : IStrategy
    {
        public void Cal()
        {
            Debug.Log("使用B策略计算");
        }
    }
    

    4. 策略模式的优缺点

    • 定义一系列算法
      策略模式的功能就是定义一系列算法,实现让这些算法可以相互替换。所以会为这一系列算法定义公共的接口,以约束一系列算法要实现的功能。如果这一系列算法具有公共功能,可以把策略接口实现成为抽象类,把这些公共功能实现到父类里面,对于这个问题,前面讲了三种处理方法,这里就不罗嗦了。
    • 避免多重条件语句
      根据前面的示例会发现,策略模式的一系列策略算法是平等的,可以互换的,写在一起就是通过if-else结构来组织,如果此时具体的算法实现里面又有条件语句,就构成了多重条件语句,使用策略模式能避免这样的多重条件语句。
    • 更好的扩展性
      在策略模式中扩展新的策略实现非常容易,只要增加新的策略实现类,然后在选择使用策略的地方选择使用这个新的策略实现就好了。
    • 客户必须了解每种策略的不同
      策略模式也有缺点,比如让客户端来选择具体使用哪一个策略,这就可能会让客户需要了解所有的策略,还要了解各种策略的功能和不同,这样才能做出正确的选择,而且这样也暴露了策略的具体实现。
    • 增加了对象数目
      由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
    • 只适合扁平的算法结构
      策略模式的一系列算法地位是平等的,是可以相互替换的,事实上构成了一个扁平的算法结构,也就是在一个策略接口下,有多个平等的策略算法,就相当于兄弟算法。而且在运行时刻只有一个算法被使用,这就限制了算法使用的层级,使用的时候不能嵌套使用。
      对于出现需要嵌套使用多个算法的情况,比如折上折、折后返卷等业务的实现,需要组合或者是嵌套使用多个算法的情况,可以考虑使用装饰模式、或是变形的职责链、或是AOP等方式来实现。

    相关文章

      网友评论

          本文标题:(六)设计模式之策略模式

          本文链接:https://www.haomeiwen.com/subject/fokytftx.html