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

2018-02-14  本文已影响0人  CrixalisAs

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. 策略模式的优缺点

上一篇 下一篇

猜你喜欢

热点阅读