【大话设计模式】—— 模板方法模式

一、概念

  上一篇文章刚刚讲了【大话设计模式】——
原型模式
,原型模式主要是通过Clone()方法,创建新的对象,免去了初始化的过程。模板方法模式也特别会“偷工减料”,把不变的行为搬移到超类,去除子类中的重复代码,将代码的复用优势展现的淋漓尽致。它为我们提供了特定的结构和样式,我们只需关心填充数据内容就好,省心啊~

  下面让我们来看一下它的准确定义:

  模板方法(TemplateMethod)模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定的步骤。

二、UML图

抽象类(AbstractClass):

1)定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。2)定义并实现了一个模板方法,这个模板方法一般是一个具体的方法,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。

具体类(ConcreteClass):

1)实现父类所定义的一个或多个抽象方法,它们是一个顶级逻辑在组成步骤。

2)每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。

三、实例解析

  最近《分手大师》和《爸爸回来了》炒的非常厉害,当然这也引发了部分观众对其中男女主人公的好奇心,当然也包括我。。。不少的访谈节目大大剖析了国民男神—小鹏哥,无敌“贱”—邓超的感情经历。经本人常年研究发现,很多男名人追老婆的步骤差不多:1.一见钟情(我猜邓超说不定是“贱”。。。)2.两情相悦 3.喜结连理(走进了“坟墓里”,然后就没有然后了~),但是他们追求嫂夫人的方式却各不相同。这正迎合了模板方法模式,定义了一个追求的骨架,具体的步骤因人而异。

  下面请欣赏代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication13
{
    class Program
    {
        //客户端代码
        static void Main(string[] args)
        {
            Console.WriteLine("李小鹏哥哥的求婚历程:");
            ChasingGirl Lxp = new Lxp();
            Lxp.Part1();
            Lxp.Part2();
            Lxp.Part3();

            Console.WriteLine("邓超哥哥的求婚历程:");
            ChasingGirl Dc = new Dc();
            Dc.Part1();
            Dc.Part2();
            Dc.Part3();

            Console.Read();
        }
    }

}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication13
{

        //如何追女生呢?
        class ChasingGirl
        {
            //追女第一步
            public void Part1()
            {
                Console.WriteLine("一见钟情");
                Console.WriteLine("具体措施:" + Measures1());
            }
            protected virtual string Measures1()
            {
                return "";
            }

            //追女第二步
            public void Part2()
            {
                Console.WriteLine("两情相悦");
                Console.WriteLine("具体措施:" + Measures2());
            }
            protected virtual string Measures2()
            {
                return "";
            }

            //追女第三步
            public void Part3()
            {
                Console.WriteLine("喜结连理");
                Console.WriteLine("具体措施:" + Measures3());
            }
            protected virtual string Measures3()
            {
                return "";
            }

        }

}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication13
{
    //李小鹏追老婆的具体方式

    class Lxp : ChasingGirl
    {
        protected override string Measures1()
        {
            return "2003世锦赛3块金牌,不仅仅为了国家,也为了爱情";
        }
        protected override string Measures2()
        {
            return "为了爱情苦学英语,请英语老师补课,注册了MSN,每天都与安琦相约在网上,用英语聊天。";
        }
        protected override string Measures3()
        {
            return "2010年6月3日,李小鹏与李安琪结束七年爱情长跑,迈入婚姻的殿堂";
        }
    }

}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication13
{
    //邓超追老婆的具体方式
    class Dc : ChasingGirl
    {
        protected override string Measures1()
        {
            return "共同出演电视剧《幸福像花儿一样》,有缘千里来相会";
        }
        protected override string Measures2()
        {
            return "戏里“对手”戏外相知 ,有开心,也有小别扭";
        }
        protected override string Measures3()
        {
            return "情人节,送礼物,有情人终成眷属";
        }
    }
}

追求历程:

四、总结

  当我们要完成某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。

  模板方法避免了子类中不变行为和可变行为的混合,帮助子类摆脱重复不变行为的纠缠。

  看到模板方法模式,让我心中小感慨了一下。从技术的角度看,它符合开闭原则,提高了编程效率;从生活角度来看,儿子继承老子给的模板,也是父爱的一种表现吧。毕竟我们的起点是建立在家庭基础之上的。但是父类却没有独裁,没有限制我们后来的发展,给了我们展示自我,突破自我的机会(也就是后来具体实现的步骤延迟到了子类),感觉老爸真的很无私,很伟大!

  虽然父亲节已过,但愿祝福的不算太晚。祝全天下的爸爸,父亲节快乐,身体健康!当然也包括给予我们父爱的米老师,谢谢您!

【大话设计模式】—— 模板方法模式,布布扣,bubuko.com

时间: 2024-10-07 05:02:59

【大话设计模式】—— 模板方法模式的相关文章

大话设计模式—模板方法模式

在模板方法模式(TemplateMethod Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型模式. 大话设计模式中程杰老师给出的定义是:模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 有一个经常用到的实例就是Spirng 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开

5.大话设计模式-代理模式

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DesignModel { public class Proxy:IAction { ZQZ zzz = null; public Proxy(ZQZ mm) { zzz = mm; } public void SendFlower() { zzz

2.大话设计模式-策略模式

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace DesignModel 8 { 9 /// <summary> 10 /// 策略模式 11 /// </summary> 12 public class TacticsModel 13 { 14 //对于

6.大话设计模式-工厂模式

工厂模式和简单工厂有什么区别.废话不多说,对比第一篇例子应该很清楚能看出来. 优点: 工厂模式弥补了简单工厂模式中违背开放-封闭原则,又保持了封装对象创建过程的优点. using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks; namespace DesignModel{    public interface Factory   

设计模式 - 模板方法模式(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)是一种被声明在抽象类中的方法, 但只有空的或者默认的实现. 钩子的存在, 可以让子类有能力

结合JDK源码看设计模式——模板方法模式

前言: 相信很多人都听过一个问题:把大象关进冰箱门,需要几步? 第一,把冰箱门打开:第二,把大象放进去:第三,把冰箱门关上.我们可以看见,这个问题的答案回答的很有步骤.接下来我们介绍一种设计模式--模板方法模式,你会发现,它与这个问题的答案实际上有很多共同之处. 一.定义 定义一个算法骨架,允许子类为一个或多个步骤提供实现.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤. 二.适用场景 一次性实现一个算法的不变的部分,将可变的行为留给子类实现 也就是将各子类中公共行为被提取

深入浅出设计模式——模板方法模式(Template Method Pattern)

模式动机 模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一.在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中.在模板方法模式中,我们需要准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意.模板方法模式体现了面向对象的诸多重要思想,是一种使用频率较高的模式. 模式定义模