• Head First设计模式之模板方法模式


    一、定义

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

    比较通俗的说法,子类决定如何实现算法中的某些步骤,比如两个一连串的操作,操作次序是一样的,有的操作相同,有的不同,将两个连串操作抽象出父类;

    子类在相同次序,但具体方法不一样的操作 在父类抽象出来,然后在子类重写实现,达到减少重复代码。

    二、结构

    三、实现

    以下以泡茶和泡咖啡为例子

    namespace DesignPatterns.Template
    {
        /// <summary>
        /// 模版方法
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
                Tea tea = new Tea();
                tea.PrepareRecipe();
    
                Console.WriteLine("==== 我是分界线 ====");
    
                Coffee  coffee = new Coffee();
                coffee.PrepareRecipe();
            }
        }
    
        public class Tea : Beverage
        {
            public override void Brew()
            {
                Console.WriteLine("冲泡茶叶");
            }
    
            public override void AddCondiments()
            {
                Console.WriteLine("加柠檬");
            }
        }
    
        public class Coffee : Beverage
        { 
            public override void Brew()
            {
                Console.WriteLine("冲泡咖啡");
            }
    
            public override void AddCondiments()
            {
                Console.WriteLine("加糖和牛奶");
            }
        }
    
        public abstract class Beverage
        {
            public void PrepareRecipe()
            {
                BoilWater();
                Brew();
                PourInCup();
                AddCondiments();
            }
    
            public abstract void Brew();
            public abstract void AddCondiments();
    
            public void BoilWater()
            {
                Console.WriteLine("泡开水");
            }
    
            public void PourInCup()
            {
                Console.WriteLine("倒进杯子");
            }
        }
    }

    结果:

    泡开水
    冲泡茶叶
    倒进杯子
    加柠檬
    ==== 我是分界线 ====
    泡开水
    冲泡咖啡
    倒进杯子
    加糖和牛奶
    请按任意键继续. . .

    四、适用场景

    在多个子类拥有相同的方法,并且这些方法逻辑相同时,可以考虑使用模版方法模式。在程序的主框架相同,细节不同的场合下,也比较适合使用这种模式。

    五、优缺点

    优点:

    模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。

    子类实现算法的某些细节,有助于算法的扩展。

    通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

    缺点:

    每个不同的实现都需要定义一个子类,导致类的个数增加,设计更加抽象;

    子类的实现也可以影响父类中主逻辑的运行,在灵活的同时,由于子类影响到了父类,违反了里氏替换原则,也会给程序带来风险。这就对抽象类的设计有了更高的要求。

    欢迎阅读本系列文章:Head First设计模式之目录

  • 相关阅读:
    怎么写好组件
    你所不知道的 URL
    响应式Web设计 – 布局
    ajax请求总是不成功?浏览器的同源策略和跨域问题详解
    滑屏 H5 开发实践九问
    UVALive
    [CQOI2018] 破解D-H协议
    [CQOI2018] 解锁屏幕
    HDU
    CodeChef
  • 原文地址:https://www.cnblogs.com/xcsn/p/7215517.html
Copyright © 2020-2023  润新知