模板方法模式

来源:互联网 发布:婚姻记录查询软件 编辑:程序博客网 时间:2024/06/01 21:37

一、理论基础

1.在现实中我们经常会遇到这种情况,有些事情的实现有固定的流程步骤,但是每一个步骤的具体实现是可变的,如我们申请护照的步骤一般是提交申请、提交相关材料、窗口办理、银行缴费、领证,这是一个固定不变的流程,但是对于每一个步骤具体怎样实现对于每一个办理点来说可能不一样,如领证这个步骤,我可以是直接去办理点领取,也可以是选择邮寄等;
2.以上这类问题应用到软件领域,我们可以采用模板方法模式来进行设计;
3.模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类,他使得子类可以不改变一个算法的机构就可以重新定义该算法的某些步骤;
4.在模板方法模式中我们将实现功能的每一个步骤所对应的方法称为基本方法,调用这些基本方法同时定义这些基本方法执行顺序的方法称为模板方法;
5.通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果;

二、实例

1.首先定义一个抽象基类,在该类中定义了一个模板方法,该方法决定了算法的总体框架和各个步骤的执行顺序
namespace TemplateMethod{    /// <summary>    /// 抽象基类,在基类中定义算法骨架即模板方法和基本方法    /// 1.模板方法是具体方法,因此不能用接口来实现模板方法模式;    /// 2.模板方法定义了总体框架即决定了总体业务流程顺序,不能被子类修改;    /// 3.基本方法可以是抽象方法、具体方法、虚方法等;    /// </summary>    public abstract class AbstractBase    {        /// <summary>        /// 模板方法,定义算法骨架        /// 如:以请客吃饭为例,总得骨架为怎么到目的地、吃什么、点单、买单、怎么回家        /// 其中点单和买单可能都是一样的,所以我们可以再父类中实现        /// </summary>        public void TemplateMethod()        {            ToDestination();            ToEat();            SinglePoint();            Pay();            GoHome();        }        /// <summary>        /// 去目的地        /// </summary>        public abstract void ToDestination();        /// <summary>        /// 吃东西        /// </summary>        public abstract void ToEat();        /// <summary>        /// 回家        /// </summary>        public abstract void GoHome();        /// <summary>        /// 点单        /// </summary>        public void SinglePoint()        {            Console.WriteLine("叫服务员点单");        }        /// <summary>        /// 买单        /// </summary>        public void Pay()        {            Console.WriteLine("到服务台买单");        }    }}
2.定义子类继承抽象基类,同时根据不同的需求实现基类中特定的抽象方法
namespace TemplateMethod{    /// <summary>    /// 学生类    /// </summary>    public class Student:AbstractBase    {        public override void ToDestination()        {            Console.WriteLine("我是学生,我坐公交去目的地");        }        public override void ToEat()        {            Console.WriteLine("我是学生,我吃汉堡");        }        public override void GoHome()        {            Console.WriteLine("我是学生,我坐公交回学校");        }    }}

namespace TemplateMethod{    /// <summary>    /// 工作的人    /// </summary>    public class WorkMen:AbstractBase    {        public override void ToDestination()        {            Console.WriteLine("我在上班,我开车去目的地");        }        public override void ToEat()        {            Console.WriteLine("我要吃佛跳墙");        }        public override void GoHome()        {            Console.WriteLine("我开车回家");        }    }}
3.使用者根据特定的需求进行调用
namespace TemplateMethod{    public class Program    {        public static void Main(string[] args)        {            AbstractBase pStudent = new Student();            pStudent.TemplateMethod();            Console.WriteLine("***********************************");            AbstractBase pWorkMen = new WorkMen();            pWorkMen.TemplateMethod();            Console.ReadLine();        }    }}

三、实质

1.抽象共同点:对业务或算法中相同的逻辑框架进行抽象;
2.封装变化点:将框架中各个步骤的具体实现进行封装;
3.主要形式:定义一个抽象基类,在抽象基类中定义一个模板方法,该方法决定算法中各个步骤的执行顺序;定义子类继承与该抽象基类,并实现该抽象基类中的各个步骤,流程的控制由父类进行控制。

四、使用场景

1.某个方法的实现需要多个步骤,其中某些步骤的实现是固定的,某些步骤的实现是变化的;
2.我们知道一个业务或算法所需的关键步骤,并确定了这些步骤的执行顺序,但某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境有关;

0 0
原创粉丝点击