zoukankan      html  css  js  c++  java
  • 设计模式之模板模式

    模板模式概述

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

    模板方法设计模式

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

    模板模式实现

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

    首先,定义一个父类,声明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

  • 相关阅读:
    从json中获取自己想要的属性
    对称加密解密
    springboot 读取resource目录下的文件
    安装nginx 配置了ssl 启动报错
    复利计算--4.0 单元测试之JAVA版-软件工程
    《构建之法》前三章读后感
    单利 复利计算器程序1.0 2.0 3.0 [ 合 ] 之 WEB
    操作系统 实验一 命令解释程序的编写
    单利 复利计算器程序1.0 2.0 3.0 [ 合 ] 之 C语言
    统计实验数据 总结实验结果
  • 原文地址:https://www.cnblogs.com/chonglu/p/14979096.html
Copyright © 2011-2022 走看看