本文承接上文,使用面向对象重构之-从过程式设计到面向对象。
新需求来了,Manager申请Leave的过程和普通员工不一样,这个时候就需要修改几处地方:
1. 把ApplyLeave的这个函数virtual一下,abstract awaypublic class Employee
{
...
public virtual bool ApplyLeave(Leave leave)
{
...
}
...
}
2. 在manager类中overridepublic class Manager : Employee
{
...
public override bool ApplyLeave(Leave leave)
{
//... manager apply leave logic
}
...
}
发现一个问题,申请leave的大部分流程的code是可以重用的,可以把不一样的提取出来,virtual, abstract away。
这也是设计模式之一模板方法,在项目中对于简单直接的继承模型关系非常好用。
public class Employee
{
...
private void ApplyLeaveStep1()
{
...
}
private void ApplyLeaveStep2()
{
...
}
protected virtual void ExtraSteps()
{
// do nothing
}
public virtual bool ApplyLeave(Leave leave)
{
Step1();
Step2();
ExtraSteps();
}
...
}
public class Manager : Employee
{
...
public override bool ExtraSteps()
{
//... manager apply leave logic
}
...
}
为了封装不被破坏,审批的步骤使用了private。关闭了ApplyLeave的虚,子类可重写的新函数为ExtraSteps()。 这个模式是常用的设计模式之一,主要用于继承结构中,主要流程确定,子流程需要变化的情况。
下一部分,会介绍更复杂需求的场景以及使用OO重构的方法。