【模板模式】 Template Pattern

模板模式 又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤(这个我觉得很抽象,很抽象)

e:学会说“不”,把时间用在更重要的事情上

案例:在一组监控的程序中,我们需要记录程序启动和结束一些信息(日志能通过上下文的信息根据约定自动生成)

 //Ingore the unreasonable class name, just for presentation
    public abstract class BaseClass
    {
        protected void LogStart()
        {
            Console.WriteLine("Log Start Infomation");
        }

        protected void LogEnd()
        {
            Console.WriteLine("Log End Infomation");
        }

        public abstract void DoWork();

    }

    public class FirstSubClass : BaseClass
    {
        public void Execute()
        {
            base.LogStart();

            DoWork();

            base.LogEnd();
        }

        public override void DoWork()
        {
            Console.WriteLine(this.GetType().Name + "Do Work");
        }
    }

这里的不当之处在哪里?如你所见,子类负责在Execute()方法执行中的特定点调用基类,这样导致子类的编写人员需要记住这些方法,并在合适的时候调用(子类程序员好累有木有,要记住好多东西),另外一个不当之处,如果我们并不想子类能隐藏或者重写我们的日志记录,这里就会有一个隐患出现:

 public class FirstSubClass : BaseClass
    {
        protected new void LogStart()
        {
            Console.WriteLine("111Log Start Infomation");
        }
        public void Execute()
        {
            LogStart();

            DoWork();

            LogEnd();
        }

        public override void DoWork()
        {
            Console.WriteLine(this.GetType().Name + "Do Work");
        }
    }

我们重写了一下子类,用new关键字把父类的LogStart()方法隐藏了,这样的话我们调用的时候会直接调用子类的LogStart()。我们用模板模式来解决一下这两个问题:

   //Ingore the unreasonable class name, just for presentation
    public abstract class BaseClass
    {
        private void LogStart()
        {
            Console.WriteLine("Log Start Infomation");
        }

        private void LogEnd()
        {
            Console.WriteLine("Log End Infomation");
        }

        public abstract void DoWork();
        public void Execute()
        {
            LogStart();

            DoWork();

            LogEnd();
        }

    }

    public class FirstSubClass : BaseClass
    {

        public override void DoWork()
        {
            Console.WriteLine(this.GetType().Name + "Do Work");
        }
    }

我们把LogStart(),LogEnd()的权限都设置成private,这样子类就不能改变我们固定的算法了(这是完全根据业务需求来决定),把Execute提到父类,让父类来控制流程,而只让子类填写可变的算法(函数),我们子类编写人员只要根据父类的限定(abstract的方法)来编写对应的算法就好了,这样在写单元测试的时候也更加的单一化,只需要对子类自身实现的算法进行有效性测试就可以了。

若有不对,不足之处请指出,请不要只写一个:漏洞百出此类评价,谢谢大家的指点和帮助!

【模板模式】 Template Pattern

时间: 2024-10-13 20:30:50

【模板模式】 Template Pattern的相关文章

设计模式之模板模式 template

设计模式 模板模式如果有一个流程如下step1();step2();step3();step4();step5();其中step3() step5()是需要用户自己编写使用其他步骤是固定的那么可以写成 // 11111.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <memory> using namespace std; class Lib { public:

学习笔记——模板模式Template

模板模式,主要是利用多态来实现具体算法和父类逻辑的松耦合.父类中TemplateMethod内部定义了相应的算法操作顺序,子类负责实现相应的具体实现. 举例: 项目中曾遇到过一个需求,叫做高级价格体系.它对外的调用接口一致,只是在不同的应用场景下(比如普通消费和会员卡消费)计算方法有差异,简化计算流程: 1.初始化相应数据A() 2.执行价格计算B() 3.计算完成后的提示C() 等. 父类中的接口函数Run()将此顺序固定为: Run() { A(); B(); C(); } 不同场景下的子类

设计模式:模版模式(Template Pattern)-转

模版模式 又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤. 我们使用冲泡咖啡和冲泡茶的例子 加工流程: 咖啡冲泡法:1.把水煮沸.2.用沸水冲泡咖啡.3.把咖啡倒进杯子.4.加糖和牛奶 茶冲泡法:   1.把水煮沸.2.用沸水冲泡茶叶.3.把  茶 倒进杯子.4.加蜂蜜 一.创建一个创模板(抽象)类 package com.kaishengit.beverage; public abstract

模板模式Template Method

简介 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意.比如定义一个操作中的算法的骨架,将步骤延迟到子类中.模板方法使得子类能够不去改变一个算法的结构即可重定义算法的某些特定步骤. 角色 抽象类(AbstractClass):实现了模板方法,定义了算法的骨架.具体类(ConcreteClass):实现抽象类中的

【我的设计模式】模板模式

模板模式(Template Pattern), 又叫模板方法模式,通过定义一个操作的算法骨架,而将一些步骤延迟到子类中,可以不改变一个算法的结构即可以重新定义概算法的某些特定步骤. 应用场景 概念解释 类型:行为型模式

设计模式之GOF23模板模式

模板模式template method 场景:具有具体流程,但具体某一步的业务不同 到银行办理业务:排队取号,办理业务,给员工打分 请客吃饭:等待,点单,吃饭,结账 模板方法模式介绍:模板方法是编程常用的模式,它定义了一个操作中的算法骨架,将某些步骤延迟到子类中实现.这样,新的子类可以在不改变一个算法结构的前提下重新定义该算法的某些特定步骤. 核心:处理步骤(流程)由父类定义好,具体实现延迟到子类中定义 结构:抽象父类(决定流程以及抽象的业务方法等着子类实现),不同的子类实现不同的业务,客户端(

Template Pattern(模板模式)

模板方法(Template Method)模式: 准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现.模版方法模式是基于继承的代码复用的基本技术,模版方法模式的结构和用法也是面向对象设计的核心. 模版方法模式需要开发抽象类和具体子类的设计师之间的协作.一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责

设计模式之 - 模板模式(Template Pattern)

引入:这几天在看一本讲spring源码的书<SPRING技术内幕>里面在讲加载配置文件的时候,可以有不同的加载方式,如根据文件系统目录加载配置文件(FileSystemXmlApplicationContext),类路径加载配置文件(ClassPathXmlApplicationContext),以及根据项目上下文目录(XmlWebApplicationContext)加载配置文件.这个在加载的过程中就使用了模板设计模式,所以就来学习下模板设计模式. 1. 模板设计模式在书中定义:  定义一个

模板模式(Template Pattern)

引入:这几天在看一本讲spring源码的书<SPRING技术内幕>里面在讲加载配置文件的时候,可以有不同的加载方式,如根据文件系统目录加载配置文件(FileSystemXmlApplicationContext),类路径加载配置文件(ClassPathXmlApplicationContext),以及根据项目上下文目录(XmlWebApplicationContext)加载配置文件.这个在加载的过程中就使用了模板设计模式,所以就来学习下模板设计模式. 1. 模板设计模式在书中定义:  定义一个