IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]使用面向对象重构之-继承中的抽象—模板方法

    csharp25发表于 2017-02-23 22:57:53
    love 0

    本文承接上文,使用面向对象重构之-从过程式设计到面向对象。


    新需求来了,Manager申请Leave的过程和普通员工不一样,这个时候就需要修改几处地方:

    1. 把ApplyLeave的这个函数virtual一下,abstract away
    public class Employee
    {
    ...
    public virtual bool ApplyLeave(Leave leave)
            {
                ...
            }
    ...
    }
    



    2. 在manager类中override


     
    public 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重构的方法。


沪ICP备19023445号-2号
友情链接