策略模式(Strategy mode)是行为模式的一种,用来封装算法的,但是在实践中,我们发现可以用它来封装几乎任何类型的规则,只要在分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。任何需求的变化都是需要成本的,高手和菜鸟的区别就是高手可以花同样的代价获得最大的收益或者说做同样的事花最小的代价。面对同样的需求当然是改动越小越好。这里又不得不提反射,看来也必须整理一篇关于反射的笔记。
目录
1. 意图:
定义一系列的算法,把他们一个个封装起来,并且使它们可以相互转换。
定义:定义算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用。
2. 如何使用:
如何解决:各种算法类实现同一个接口,任意的替换。
优点:1.算法可以自由切换。2.避免使用多重条件判断。
3.扩展性良好。
缺点:1.策略类会增多。2.所有的策略类都需要对外暴露。
何时使用:
1.如果在系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
2.一个系统需要动态的在几种算法中选择一种。
注意事项:如果一个系统的策略过多,就需要考虑使用混合模式,解决策略类膨胀的问题。
3. UML模板:
4. 关键代码:
public class StrategyMode : MonoBehaviour
{
// Use this for initialization
void Start()
{
Context context;
context = new Context(new ConcreteStrategyA());
context.ContextInterface();
context = new Context(new ConcreteStrategyB());
context.ContextInterface();
context = new Context(new ConcreteStrategyC());
context.ContextInterface();
}
}
//抽象算法类
abstract class Strategy
{
//算法方法
public abstract void AlgorithmInterface();
}
//具体算法A
class ConcreteStrategyA : Strategy
{
public override void AlgorithmInterface()
{
Debug.Log("算法A实现");
}
}
//具体算法B
class ConcreteStrategyB : Strategy
{
//算法B实现方法
public override void AlgorithmInterface()
{
Debug.Log("算法B实现");
}
}
//具体算法C
class ConcreteStrategyC : Strategy
{
public override void AlgorithmInterface()
{
Debug.Log("算法C实现");
}
}
class Context
{
Strategy strategy;
//初始化时,传入具体的策略对象
public Context(Strategy strategy)
{
this.strategy = strategy;
}
//上下文接口
//根据具体的策略对象,调用其算法的方法。
public void ContextInterface()
{
strategy.AlgorithmInterface();
}
}