一、目的:消除 if else 使程序易于扩展。
二、方法:参数自备处理方法并统一接口,执行方法接受参数时直接反调它提供的接口方法。
三、点评:这个方式将 “执行者内部的条件扩展” 转化成了 “以参数传入的外部对象的继承扩展”。可以灵活应对参数扩展,不用修改处理类。
仔细看看,其实它就是 策略模式。
采用这个思路方法(策略模式)的设计模式有不少,可以仔细品味:
命令模式(“命令类” 相当于 “此处A、B、C参数类”);
访问者模式(“访问者类” 相当于 “此处A、B、C参数类”);
状态模式(“状态” 相当于“此处A、B、C参数类”。有略微差别,但其实 “先改变状态再执行” 和 “在执行时以参数传入状态” 是类似的)
四、演示:
using UnityEngine;
/// <summary>
/// 消除 if else 使程序易于扩展
/// </summary>
//消除前
namespace ClearIfElse.Way2.Old
{
public abstract class Parm { }
public class A : Parm { }
public class B : Parm { }
public class C : Parm { }
public class Executor
{
public void Execute(Parm parm)
{
if (parm is A)
{
DoSthA();
}
else if (parm is B)
{
DoSthB();
}
else if (parm is C)
{
DoSthC();
}
}
private void DoSthA() { Debug.Log("做A事"); }
private void DoSthB() { Debug.Log("做B事"); }
private void DoSthC() { Debug.Log("做C事"); }
}
public class Client
{
static public void Main()
{
Executor executor = new Executor();
executor.Execute(new A());
executor.Execute(new B());
executor.Execute(new C());
}
}
}
//消除后
namespace ClearIfElse.Way2.New
{
public abstract class Parm
{
public abstract void DoSth();
}
public class A : Parm
{
public override void DoSth() { Debug.Log("做A事"); }
}
public class B : Parm
{
public override void DoSth() { Debug.Log("做B事"); }
}
public class C : Parm
{
public override void DoSth() { Debug.Log("做C事"); }
}
public class Executor
{
public void Execute(Parm parm)
{
parm.DoSth();
}
}
public class Client
{
static public void Main()
{
Executor executor = new Executor();
executor.Execute(new A());
executor.Execute(new B());
executor.Execute(new C());
}
}
}