模板模式

定义

在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

UML类图

实现

案例:以前后端开发流程为例,
得到需求 -> 打开工具编写代码 -> 测试

抽象开发类

    public abstract class Development
    {
        public void SolveProblems()
        {
            GetProblems();
            WriteCode();
            Testing();
        }

        public void GetProblems()
        {
            Console.WriteLine("获得新的需求");
        }

        public abstract void WriteCode();

        public void Testing()
        {
            Console.WriteLine("进行测试");
        }
    }

前端开发类

    public class Frontend : Development
    {

        public override void WriteCode()
        {
            Console.WriteLine("完成页面交互");
            Console.WriteLine("从后端接口获取数据");
            Console.WriteLine("数据绑定");
        }
    }

后端开发类

    public class Backend : Development
    {
        public override void WriteCode()
        {
            Console.WriteLine("业务逻辑开发");
            Console.WriteLine("存储操作");
            Console.WriteLine("接口封装");
        }
    }

抽象父类中的SolveProblems方法为模板方法,WriteCode定义为抽象方法,每个子类实现自己的算法。

模板方法还提供了钩子函数,用于控制模板方法中的流程或者重写父类中的某些行为(例如对模板方法返回的结果重新排序)。

比如

    public abstract class Development
    {
        public void SolveProblems()
        {
            GetProblems();
            WriteCode();
            Testing();
            if (IsGoodJob())
            {
                TeamBuilding();
            }
        }

        public void GetProblems()
        {
            Console.WriteLine("获得新的需求");
        }

        public abstract void WriteCode();

        public void Testing()
        {
            Console.WriteLine("进行测试");
        }

        public virtual bool IsGoodJob()
        {
            return true;
        }

        public void TeamBuilding()
        {
            Console.WriteLine("下班团建");
        }

    }
    public class FrontEnd : Development
    {

        public override void WriteCode()
        {
            Console.WriteLine("完成页面交互");
            Console.WriteLine("从后端接口获取数据");
            Console.WriteLine("数据绑定");
        }

        public override bool IsGoodJob()
        {
            return false;
        }
    }
原文地址:https://www.cnblogs.com/Saints/p/12630229.html