c#设计模式系列:模板方法模式(Template Method Pattern)

引言

提到模板,大家肯定不免想到生活中的“简历模板”、“论文模板”、“Word中模版文件”等,在现实生活中,模板的概念就是——有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载下来简历模板之后我们可以根据自己的情况填充不同的内容要完成属于自己的简历。在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概念来理解模板方法的定义。

模板方法介绍

模板方法模式的定义

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模仿方法使得子类可以不改变一个算法的结构既可重定义该算法的某些特定步骤

模仿方法模式的结构图

模式的组成

AbstractClass是抽象类,其实也就是一个抽象模板,定义并实现了一个模板方法,这个模板方法一般是一个具体的方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现,顶级逻辑也有可能调用一些具体的方法

ConcreteClass实现了父类所定义的一个或多个抽象放啊,每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以出这些抽象方法(也就是顶级逻辑的组成步骤)不同的实现,从而使得顶级逻辑的实现各不相同

看了模板方法的定义以及结构图,下面我们来看看在代码中如何使用

题目:要下课了老师在黑板出家庭作业,每个学生都要抄题目。

第一版无模式

    /// <summary>
    /// 学生甲
    /// </summary>
    public class MethodA
    {
        public void TestQuestion1()
        {
            Console.WriteLine("试题一【】 a.正确 b 错误 c 无解");

            Console.WriteLine("答案:b");
        }

        public void TestQuestion2()
        {
            Console.WriteLine("试题二【】 a.正确 b 错误 c 无解");

            Console.WriteLine("答案:a");
        }

        public void TestQuestion3()
        {
            Console.WriteLine("试题三【】 a.正确 b 错误 c 无解");

            Console.WriteLine("答案:c");
        }
    }

    /// <summary>
    /// 学生已
    /// </summary>
    public class MethodB
    {
        public void TestQuestion1()
        {
            Console.WriteLine("试题一【】 a.正确 b 错误 c 无解");

            Console.WriteLine("答案:b");
        }

        public void TestQuestion2()
        {
            Console.WriteLine("试题二【】 a.正确 b 错误 c 无解");

            Console.WriteLine("答案:a");
        }

        public void TestQuestion3()
        {
            Console.WriteLine("试题三【】 a.正确 b 错误 c 无解");

            Console.WriteLine("答案:c");
        }
    }

  /// <summary>
    /// 客户端
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("学生甲的试题:");
            MethodA a = new MethodA();
            a.TestQuestion1();
            a.TestQuestion2();
            a.TestQuestion3();

            Console.WriteLine("学生已的试题:");
            MethodB  B= new MethodB();
            B.TestQuestion1();
            B.TestQuestion2();
            B.TestQuestion3();
        }
    }

可以看出内容相识度很高,除了答案不同,没什么不一样了,这样的代码容易出错,难以维护,学习了模板方法以后进行改版

第二版

 /// <summary>
    /// 抽象类
    /// </summary>
    public abstract class TestQuestion
    {
        public void TestQuestion1()
        {
            Console.WriteLine("试题一【】 a.正确 b 错误 c 无解");

            Console.WriteLine("答案:"+ Anster1());
        }
        public void TestQuestion2()
        {
            Console.WriteLine("试题二【】 a.正确 b 错误 c 无解");

            Console.WriteLine("答案:"+Anster2());
        }

        public void TestQuestion3()
        {
            Console.WriteLine("试题三【】 a.正确 b 错误 c 无解");

            Console.WriteLine("答案:"+ Anster3());
        }
        public virtual string Anster1()
        {
            return "";
        }
        public virtual string Anster2()
        {
            return "";
        }
        public virtual string Anster3()
        {
            return "";
        }
    }

    /// <summary>
    /// 学生甲
    /// </summary>
    public class MethodA:TestQuestion
    {
        public override string Anster1()
        {
            return "a";
        }
        public override string Anster2()
        {
            return "b";
        }
        public override string Anster3()
        {
            return "c";
        }
    }
    /// <summary>
    /// 客户端
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("学生甲的试题:");
            TestQuestion a = new MethodA();
            a.TestQuestion1();
            a.TestQuestion2();
            a.TestQuestion3();

        }
    }

y引入模板方法模式后,代码的可读性增加了,将不变的代码抽象为父类,子类子需要填写答案就行了

模板方法模式的优缺点

优点:

  1. 实现了代码复用

  2. 能够灵活应对子步骤的变化,符合开放-封闭原则

缺点:因为引入了一个抽象类,如果具体实现过多的话,需要用户或开发人员需要花更多的时间去理清类之间的关系。

附:在.NET中模板方法的应用也很多,例如我们在开发自定义的Web控件或WinForm控件时,我们只需要重写某个控件的部分方法

总结

到这里,模板方法的介绍就结束了,模板方法模式在抽象类中定义了算法的实现步骤,将这些步骤的实现延迟到具体子类中去实现,从而使所有子类复用了父类的代码,所以模板方法模式是基于继承的一种实现代码复用的技术。

原文地址:https://www.cnblogs.com/studydp/p/9568528.html

时间: 2024-10-13 01:25:50

c#设计模式系列:模板方法模式(Template Method Pattern)的相关文章

设计模式 - 模板方法模式(template method pattern) JFrame 详解

模板方法模式(template method pattern) JFrame 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式(template method pattern), Java的JFrame使用模板方法模式, paint()是可以覆盖的方法,

设计模式 - 模板方法模式(template method pattern) Applet 详解

模板方法模式(template method pattern) Applet 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式(template method pattern), applet就是一个能够在网页上面执行的小程序, applet有很多钩子(

设计模式 - 模板方法模式(template method pattern) 排序(sort) 详解

模板方法模式(template method pattern) 排序(sort) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式的一个主要的应用是排序(sort)算法. 对象的排列方式并不是完全相同, 所以需要排序(sort)算法compareTo()

设计模式 - 模板方法模式(template method pattern) 详解

模板方法模式(template method pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template method pattern): 在一个方法中定义一个算法的骨架, 而将一些步骤延迟到子类中. 模板方法使得子类可以在不改变算法结构的情况下, 重新定义算法中的某些步骤. 模板方法可以进行挂钩(hook), 钩子(hook)是一种被声明在抽象类中的方法, 但只有空的或者默认的实现. 钩子的存在, 可以让子类有能力

设计模式 - 模板方法模式(template method pattern) JFrame 具体解释

模板方法模式(template method pattern) JFrame 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式(template method pattern), Java的JFrame使用模板方法模式, paint()是能够覆盖的方

设计模式 - 模板方法模式(template method pattern) Applet 具体解释

模板方法模式(template method pattern) Applet 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式(template method pattern), applet就是一个可以在网页上面运行的小程序, applet有非常多

设计模式 - 模板方法模式(template method pattern) 排序(sort) 具体解释

模板方法模式(template method pattern) 排序(sort) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式的一个基本的应用是排序(sort)算法. 对象的排列方式并非全然同样, 所以须要排序(sort)算法compareTo(

设计模式之模板方法模式(Template Method)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

设计模式(九): 从醋溜土豆丝和清炒苦瓜中来学习&quot;模板方法模式&quot;(Template Method Pattern)

今天是五.四青年节,祝大家节日快乐.看着今天这标题就有食欲,夏天到了,醋溜土豆丝和清炒苦瓜适合夏天吃,好吃不上火.这两道菜大部分人都应该吃过,特别是醋溜土豆丝,作为“鲁菜”的代表作之一更是为大众所熟知,醋溜土豆丝,好吃不上火.清炒苦瓜这道菜好啊,更是夏天必备之良菜,其功效在此就不做过多赘述了.言归正传,上篇博客我们从“小弟”中学习了“外观模式”,我们也把“外观模式”戏称为“小弟模式”.今天我们要从醋溜土豆丝和清炒苦瓜的制作过程中来学习一下我们今天博客的主题“模板方法模式”(Template Me

设计模式(行为型)之模板方法模式(Template Method Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(行为型)之命令模式(Command Pattern)>http://blog.csdn.net/yanbober/article/details/45500113 概述 模板方法模式是一种基于继承的代码复用,它是一种类行为型模式:是结构最简单的行为型设计模式,在其结构