Loading

设计模式之模板模式

模板模式概述

模板方法模式是一种行为设计模式, 它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。

模板方法设计模式

比如:完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。每个步骤的具体实现,由子类完成。

模板模式实现

下面以生活中做饭的栗子,用代码来实现。首先假设做菜的步骤分为三步,第一步备料,第二步做菜,第三步装盘。试想一下这个顺序可以颠倒嘛?先装盘在做菜可行吗?如果做的菜多了是不是有点难以维护?

首先,定义一个父类,声明3个抽象方法,再定义一个具体的做菜步骤方法,代码如下:

public abstract class DodishTemplate
    {
        public void dodish()
        {
            preparation();
            doing();
            carriedDishes();
        }

        public abstract void preparation();
        public abstract void doing();
        public abstract void carriedDishes();
    }

接着创建子类,比如我现在要做一个酸辣土豆丝,继承抽象父类,并实现抽象方法

public class Potatoes : DodishTemplate
    {
        public override void carriedDishes()
        {
            Console.WriteLine("清洗土豆并切丝,准备少许辣椒丝");
        }

        public override void doing()
        {
            Console.WriteLine("起锅烧油,放入土豆丝,适时加入调味里奥、盐等佐料。倒入辣椒丝");
        }

        public override void preparation()
        {
            Console.WriteLine("等待片刻,盛碗装盘");
        }
    }

比如要做一道番茄炒蛋,与上同理

public class Tomato : DodishTemplate
    {
        public override void carriedDishes()
        {
            Console.WriteLine("清洗并切西红柿,打鸡蛋。");
        }

        public override void doing()
        {
            Console.WriteLine("鸡蛋倒入锅里,然后倒入西红柿一起炒。");
        }

        public override void preparation()
        {
            Console.WriteLine("将炒好的西红寺鸡蛋装入碟子里");
        }
    }

最后在客户端调用

static void Main(string[] args)
        {
            Console.WriteLine("----------------------酸辣土豆丝----------------------");
            DodishTemplate potatoe = new Potatoes();
            potatoe.dodish();
            Console.WriteLine("----------------------番茄炒蛋----------------------");
            DodishTemplate tomato = new Tomato();
            tomato.dodish();

            Console.WriteLine("Press Any Key to end!");
            Console.ReadKey();
        }

输出结果:
image-20210706213245765

可以看出来,子类(做具体某一道菜时),始终不易出错,且很容易就能实现,这就可以称之为原型模式,实际上,继承,多态玩的溜的,肯定多少都会用到这个模式了,只是有时候我们自己忽略了,确实是个很常用的设计模式,也很容易理解及实现。

模板模式优缺点

优点

  • 可仅允许客户端重写一个大型算法中的特定部分, 使得算法其他部分修改对其所造成的影响减小。
  • 可将重复代码提取到一个超类中。

缺点

  • 部分客户端可能会受到算法框架的限制。
  • 通过子类抑制默认步骤实现可能会导致违反_里氏替换原则_。
  • 模板方法中的步骤越多, 其维护工作就可能会越困难。

模板模式应用场景

主要解决:一些方法通用,却在每一个子类都重新写了这一方法。

何时使用:有一些通用的方法。

如何解决:将这些通用算法抽象出来。

关键代码:在抽象类实现,其他步骤在子类实现。

使用场景: 1、有多个子类共有的方法,且逻辑相同。 2、重要的、复杂的方法,可以考虑作为模板方法。

示例源代码

源代码地址:https://github.com/luchong0813/DesignModel

posted @ 2021-07-06 21:38  傲慢与偏见luc  阅读(39)  评论(0编辑  收藏  举报