策咯模式
在策略模式中,一个类的行为或其算法可以在运行时更改。(策略模式属于行为模式的一种)。主要解决:在多种算法相似的情况下,使用if…else所带来的复杂和难以维护的情况。
优点:1.算法可以自由切换。2.避免使用多重条件判断。3.扩展性好。
缺点:1.策略类会增多。2.所有的策略类都需要对外暴露,安全性差。
关键逻辑:让所有的策略类使用同一个接口。
使用场景:1.一个系统里需要动态的在几种算法中选择一种执行。
2.如果一个对象有很多的行为,不使用设计模式,就必须要使用多重语句来判断了。例如一个英雄选择哪种武器去战斗,需要进行选择。
注意事项:如果一个系统里策略多余四个,就需要使用混合模式,解决策咯模式膨胀的问题。
可参考策略模式的结构:
我来演示一个例子:一个战士选择用那种武器开火。
具体代码如下:
1.首先创建一个接口枪类:Gun类。(相当于上图的Strategy类)
public interface Gun
{
//枪开火的方法
void Fire();
}
2.创建枪的实体类,具体有哪些枪
相当于上图的OpearationAdd类
/// <summary>
/// 长枪
/// </summary>
public class Spear : Gun
{
public void Fire()
{
Debug.Log("战士使用长枪开火了");
}
}
相当于上图的OpearationSubstract类
/// <summary>
/// 短枪
/// </summary>
public class ShortGun : Gun
{
public void Fire()
{
Debug.Log("战士使用短枪开火了");
}
}
相当于上图的OpearationMultiply类
/// <summary>
/// 手枪
/// </summary>
public class Pistol:Gun
{
public void Fire()
{
Debug.Log("战士使用手枪开火了");
}
}
3.创建一个传递信息的类。(相当于战士告诉下属他今天想用什么武器作战,下属帮他去取)
/// <summary>
/// 传递类
/// </summary>
public class Context
{
private Gun gun;
public Context(Gun gun)
{
this.gun = gun;
}
/// <summary>
/// 通知开火
/// </summary>
public void InformFire()
{
gun.Fire();
}
}
4.创建一个战士类。(战士开始去作战)(相当于上图StrategyPatternDemo)
/// <summary>
/// 战士
/// </summary>
class Soldier: MonoBehaviour
{
private void Start()
{
//战士使用短枪作战
Context context = new Context(new ShortGun());
context.InformFire();
}
}
运行结果: