修改前
public class Component
{
public enum Status
{
None,
Installed,
Uninstalled
}
Status m_status = Status.None;
void Do()
{
switch(m_status)
{
case Status.None:
Console.WriteLine("Error...");
break;
case Status.Installed:
Console.WriteLine("Hello!");
break;
case Status.Uninstalled:
Console.WriteLine("Error...");
default:
break;
}
}
}
使用switch分支是一种经典的做法,当组件的状态不存在变化的可能时,该段代码无可挑剔,堪称完美。
但在实际项目中,过了一段时间后,我们发现组件的状态不够,在枚举中加一个状态,在switch中加一个分支。后面需要的状态,我还不得而知。
这个是严重违反开闭原则
使用继承/组合封装变化点
public class ComponentStatus
{
public virtual void Do(){}
}
public class ComponentNone:ComponentStatus
{
public override void Do(){ Console.WriteLine("Error...");}
}
public class ComponentInitialized:CommponentStatus
{
public override void Do(){Console.WriteLine("Hello!");}
}
public class Component
{
ComponentStatus m_status = new ComponentNone();
public void ChangeStatus(ComponentStatus newStatus)
{
m_status = newStatus;
}
public void Do()
{
m_status.Do();
}
}