行为型模式–策略模式
提示:文章只是个人的学习总结。
一、策略模式是什么?
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法都是完成相同的工作,只是实现不同,它可以以相同的方式调用所有算法,减少各种算法类与使用算法类之间的藕合。
如在某个场景中有不同的实现方式,但是都是为了实现一个功能,我们可以将其定义成一组策略,每个实现类对应一个策略,在不同的场景就使用不同的实现类,并且可以自由切换策略。
当不同的行为堆砌在同一个类时,就很难避免使用条件语句去选择合适的行为,将这些行为封装在一个个独立的Strategy中,可以在使用这些行为的类去消除条件语句。
二、UML图
//TODO
三、实现步骤
1、定义策略接口
抽象类或者接口
using UnityEngine.UI;
public abstract class ChangeColor
{
public Image img;
public virtual void ExChangeColor() { }
}
2、具体策略
//修改图片颜色为红色
using UnityEngine;
public class ChangeRed : ChangeColor
{
public override void ExChangeColor()
{
img.color = Color.red;
}
}
-------------------
//修改图片颜色为蓝色
using UnityEngine;
public class ChangeBlue : ChangeColor
{
public override void ExChangeColor()
{
img.color = Color.blue;
}
}
3、策略上下文
维护对strategy 对象的引用
代码如下(示例):
using UnityEngine.UI;
public class StategyContext
{
ChangeColor strategy;
public StategyContext(ChangeColor strategy,Image img)
{
this.strategy = strategy;
this.strategy.img = img;
}
public void StategyContextInterface()
{
strategy.ExChangeColor();
}
}
4、实现类
using UnityEngine.UI;
public class StategyManager : MonoBehaviour
{
[SerializeField] private Image img;
StategyContext stategyContext;
void Update()
{
if (Input.GetKeyDown(KeyCode.R))
{
stategyContext = new StategyContext(new ChangeRed(), img);
stategyContext.StategyContextInterface();
}
if (Input.GetKeyDown(KeyCode.B))
{
stategyContext = new StategyContext(new ChangeBlue(), img);
stategyContext.StategyContextInterface();
}
}
}
四、好处和坏处
1、好处
1.减少大量if-else的使用
2.简化的单元测试
3.符合开闭原则,扩展性好、便于维护且代码优雅
2、坏处
1.滥用会导致会造成策略类膨胀,每次变化都会新增新的类
2.策略模式本身并没有改变需要判断,客户端必须知道所有的策略类的作用
3.无法同时在客户端使用多个策略类
五、适用场景
1.避免使用难以维护的多重条件选择语句
2.当策略中有较为复杂的数据结构或者算法不需要暴露在客户端或者其他时。
附
1,大话设计模式
2.策略模式