zoukankan      html  css  js  c++  java
  • 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设计模式之目录

  • 相关阅读:
    归并排序法实现
    HuffmanTree
    快速排序法的实现
    随机数发生器说明
    装箱问题改进
    瞬间判断2的幂
    weblogic删除域
    【转】Mock方法介绍
    Oracle 11G空表无法导出处理
    深入理解JVM虚拟机(一):JVM运行时数据区
  • 原文地址:https://www.cnblogs.com/xcsn/p/7215517.html
Copyright © 2011-2022 走看看