假设开发自动驾驶系统。在设计之初,自动驾驶系统拥有一个驾驶系统命令的枚举类型:
enum DriveCommand
{
start,
stop
}
又假设有一个驾驶的方法处理车辆接收到的指令。一开始我们这样编码:
static void Main(string[] args)
{
DriveCommand comand=DriveCommand.Start;
Drive(comand);
comand=DriveCommand.Stop;
Drive(command);
}
static void Drive(DriveCommand command)
{
if(command==DriveCommand.Start)
{
//车辆启动
} else if(command==DriveCommand.Stop)
{
//车辆停止
}
}
或者用Switch:
static void Drive(DriveCommand command)
{
switch(command)
{
case DriveCommand.Start:
//车辆启动
break;
case DriveCommand.Stop:
//车辆停止
break;
default:
break;
}
}
随着更多的功能被开发出来,我们加入的命令也越来越多。
enum DriveCommand
{
start,
stop,
pause,
turnLeft
.
.
}
随着DriveCommand元素的增加,采用if语句或switch语句会非常的混乱,在复杂的兄台你各种命令可能会多达上百条。每增加一个命令我们都要修改Drive方法。Drive方法将会及其膨胀,并且每一行的代码几乎一样。
在这种情况下,我们不得不考虑重构原来的代码,遵守设计模式中的开闭原则。开闭原则指的是:对扩展开放,修修改关闭。
设计个抽象类:
abstract class Commander
{
public abstract void Execute();
}
所有的Start或者Stop之类的命令,继承这个抽象类。
class StartCommander:Commander
{
public override void Execute()
{
//启动
}
}
class StopCommander:Commander
{
public override void Execute()
{
//停止
}
}
使用多态后,下面的代码改为:
static void Main(string[] args)
{
Commander commander=new StartCommander();
Driver(commander);
commander=new StopCommander();
Driver(commander);
}
static void Drive(Commander commander)
{
commander.Execute();
}
这样代码简洁了不少,并且,可扩展性增强了,对于Drive方法,即使增加再多的命名,也不需要对齐修改。