策略模式定义:
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
策略模式的功能
策略模式的功能是把具体的算法实现,从具体的业务处理里面独立出来,把它们实现成为单独的算法类,从而形成一系列的算法,并让这些算法可以相互替换。
策略模式的重心不是如何来实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活、具有更好的维护性和扩展性。
优缺点
优点:
1.提供了一种替代继承方法,而且既保持了继承的优点,还比继承更灵活
2.避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展
3.高内聚,低耦合
缺点:
1.因为每个具体策略模式都会产生一个新类,所以会增加系统需要维护的类的数量
使用场景:
1.多个类之区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为.
2.需要在不同情况下使用的算法,或者算法还可以在未来用其他方式来实现.
3.对客户隐藏具体算法的实现细节,彼此完成独立
策略模式原型代码实现
首先先来看看UML图,context为策略拥有者,IStategy策略的接口,然后下面是两个策略类,这样设计的话可以很轻易的就更改需要使用的策略。
image.png
下面是代码的实现
using UnityEngine;
public class DM03Strategy:MonoBehaviour
{
private void Start()
{
StrategyContrxt contex = new StrategyContrxt();
contex.stragegy = new ConcreteStrategyA();
contex.Cal();
}
}
public class StrategyContrxt
{
public IStrategy stragegy;
public void Cal()
{
stragegy.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策略计算");
}
}
输出:
image.png
需要修改到B策略只需要修改Start方法里面的接口IStrategy对应的实现就行了
contex.stragegy = new ConcreteStrategyB();
image.png
总结
1)策略模式是一个比较容易理解和使用的设计模式,策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不同的对象管理。策略模式通常把一个系列的算法封装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
2)在策略模式中,应当由客户端自己决定在什么情况下使用什么具体策略角色。
3)策略模式仅仅封装算法,提供新算法插入到已有系统中,以及老算法从系统中“退休”的方便,策略模式并不决定在何时使用何种算法,算法的选择由客户端来决定。这在一定程度上提高了系统的灵活性,但是客户端需要理解所有具体策略类之间的区别,以便选择合适的算法,这也是策略模式的缺点之一,在一定程度上增加了客户端的使用难度。
策略模式
http://www.uml.org.cn/sjms/201009092.asp
http://blog.csdn.net/hguisu/article/details/7558249
网友评论