zoukankan      html  css  js  c++  java
  • 解读设计模式模板方法模式(Template Method),电脑就是这样造出来的

    一. 模式概述

          摸板方法(Template Method)模式是一种非常简单而又经常使用的设计模式.先创建一个父类,把其中的一个或多个方法留给子类去实现,这实际上就是在使用摸板模式.所谓的摸板模式可以这样来理解:"在一个类中定义一个算法,但将此算法的某些细节留到子类中去实现.换句话说,基类是一个抽象类,那么你就是在使用一种简单形式的摸板模式."

          更近一步可以这样来理解:"准备一个抽象类,将部分逻辑以具体方法的形式实现,然后申明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方法实现这些抽象方法,从而对剩余的逻辑有不同的实现."

    二. 模式意图

          将一个类的基本部分抽取出来放到一个基类中,这样它就不必重复出现在几个派生类里.

    三. 模式UML图(下图转自http://www.dofactory.com/)

                               
    四. 模式结构与参与者

         抽象摸板角色:

            1. 定义了一个或多个抽象操作,以便让子类实现.

            2. 定义并实现了一个摸板方法.

         具体摸板角色:

            1. 实现父类所定义的一个或多个抽象方法.

            2. 每一个抽象摸板角色都可以有任意多个具体摸板角色与之对应.

            3. 每一个具体摸板角色都可以给出这些抽象方法的不同实现.

    五. 模式中的方法种类

        1. 抽象模板角色里提供完整的方法,它完成了所有派生类都要用到的一些基本功能.

        2. 抽象模板角色里只提供空方法,把功能全部留给派生类去实现.

        3. 抽象模板角色里只包含某些操作的默认实现,派生类里可以重新定义这些方法的实现.

        4. 抽象模板角色里模板方法,他是一个调用抽象方法,钩子方法以及具体方法的各种组合.

    六. 造电脑的示例

          首先来看一张图片:

                           

          不用我说,大家都知道,一台电脑(参考上图)的基本组成部分包括的硬件主要有CUP,主板,硬盘,显卡以及内存等.OK,现在的需求就是要去造一台电脑,可计算机生产商有没给我们提供生产电脑的方法(MackPC)呢?没有吧,那么我们自己来定义一个总可以吧(听起好象有点夸张,呵呵,怎么生产电脑的方法也可以自己定义了,那不是自己就可以生产电脑了,可不是呢,这里只是定义了一个生产电脑的程序方法罢).OK,Go!

     1namespace DesignPattern.TemplateMethod.Computer
     2{
     3    /// <summary>
     4    /// 抽象摸板角色
     5    /// 定义了一个或多个抽象操作,以便让子类实现。
     6    /// 定义并实现了一个模板方法。
     7    /// </summary>

     8    public abstract class Template
     9    {
    10        protected String pcType;
    11        public Template(String pcType)
    12        {
    13            this.pcType = pcType;
    14        }

    15
    16        //留给子类去实现(抽象操作)
    17        protected abstract void MakeCUP(String pcType);
    18        protected abstract void MakeMainBorad(String pcType);
    19        protected abstract void MakeHD(String pcType);
    20
    21        private  void MakeOver(String pcType) 
    22        {
    23           Console.WriteLine(pcType + "造好了!");
    24        }

    25    
    26        /// <summary>
    27        /// 摸板方法
    28        /// </summary>

    29        public  void MakePC()
    30        {
    31            MakeCUP(pcType);
    32            MakeMainBorad(pcType);
    33            MakeHD(pcType);
    34
    35            MakeOver(pcType);
    36        }

    37    }

    38}

         在上面的抽象摸板角色(Template)里,分别定义了生产CPU(MakeCPU),生产主板(MakeMainBorad)以及生产硬盘(MakeHD)的抽象操作(实际中电脑并不只有这三个组成部分,这里为了更简单的演示,故只取了这三个主要组成部分作为示例).在这里,MakePC方法则作为摸板方法.

     1namespace DesignPattern.TemplateMethod.Computer
     2{
     3    /// <summary>
     4    ///  具体摸板角色
     5    ///  实现父类所定义的一个或多个抽象方法。
     6    ///  每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现。
     7    /// </summary>

     8    public class NotePc : Template
     9    {
    10        public NotePc(string pcType)
    11            : base(pcType)
    12        { }
    13
    14        protected override void MakeCUP(string pcType)
    15        {
    16            Console.WriteLine(pcType + "的CPU造好了");
    17        }

    18
    19        protected override void MakeMainBorad(string pcType)
    20        {
    21            Console.WriteLine(pcType + "的硬盘造好了");
    22        }

    23
    24        protected override void MakeHD(string pcType)
    25        {
    26            Console.WriteLine(pcType + "的主板造好了");
    27        }

    28    }

    29}

         NotePC作为模式参与者中的具体摸板角色,实现了抽象摸板角色(Template)里的抽象方法.

        

          OK,到这里抽象模板(Template)和具体模板(NotePC)都已经准备好了.可说是"万事具备,只欠命令"了,那么,现在就对模板下放一命令,让其制造一"笔记本"电脑出来.

     1namespace DesignPattern.TemplateMethod.Computer
     2{
     3    /// <summary>
     4    /// 简单的造笔记本摸板

     5    class Client
     6    {
     7        public static void Main1(string[] args)
     8        {
     9            Template t = new NotePc("笔记本");
    10            t.MakePC();
    11        }

    12    }

    13}

    程序运行结果如下:

           

    七. 典型的摸板方法应用

       1. HttpServlet技术

           HttpServlet类提供了一个service()方法.这个方法调用了一个或是多个do方法,完成对客户端发起的请求的处理,这些do方法则是由具体的HttpServlet类提供的.那么这里的service()方法就是一个摸板方法.

    注:转载请注明出处: http://beniao.cnblogs.com/ 或  http://www.cnblogs.com/   作者:beniao

  • 相关阅读:
    从Oracle提供两种cube产品说开
    Sql Server DWBI的几个学习资料
    Unload Oracle data into text file
    初学Java的几个tips
    我常用的Oracle知识点汇总
    benefits by using svn
    如何在windows上使用putty来显示远端linux的桌面
    building commercial website using Microsoft tech stack
    Understand Thread and Lock
    Update google calendar by sunbird
  • 原文地址:https://www.cnblogs.com/beniao/p/1247194.html
Copyright © 2011-2022 走看看