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

在模板方法模式(TemplateMethod Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。

大话设计模式中程杰老师给出的定义是:模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

有一个经常用到的实例就是Spirng 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,我们不必重复写那些已经规范好的代码,直接给出一个实体就可以保存。

模板方法模式的结构图如下:

代码示例如下:

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

//抽象类,实现了一些模板方法
public class abstract AbstractClass{

    //一些抽象行为,放到子类中其实现
    public abstract void PrimitiveOperation1();
    public abstract void PrimitiveOperation2();

    //模板方法,给出了逻辑的骨架,而逻辑的组成是一些相应的抽象操作,他们都推迟到子类中去实现
    public final void TemplatMethod(){

        initialize();
        PrimitiveOperation1();
        PrimitiveOperation2();

    }

}

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

注意ConcreteClass类中方法的顺序和模板类中方法的顺序,具体的逻辑实现顺序至于模板中定义的逻辑顺序有关系。

//抽象类的某个实现类A
public Class ConcreteClassA extends AbstractClass{

    @override
    public void PrimitiveOperation2(){

        System.out.println("类A具体实现方法2");

    }

     @Override
    public void initialize() {
         System.out.println("CocreteClassA Initialized");
    }

    @override
    public void PrimitiveOperation1(){

        System.out.println("类A具体实现方法1");

    }

}
//抽象类的某个实现类B
public Class ConcreteClassB extends AbstractClass{

    @override
    public void PrimitiveOperation2(){

        System.out.println("类B具体实现方法2");

    }

     @Override
    public void initialize() {
         System.out.println("CocreteClassB Initialized");
    }

    @override
    public void PrimitiveOperation1(){

        System.out.println("类B具体实现方法1");

    }

}
//测试方法
public static void main(String[] args){

    AbstractClass ac;

    ac = new ConcreteClassA();
    ac.TemplatMethod();

    ac = new ConcreteClassB();
    ac.TemplatMethod();

}

运行结果:

CocreteClassA Initialized
类A具体实现方法1
类A具体实现方法2

CocreteClassB Initialized
类B具体实现方法1
类B具体实现方法2

模板方法模式的特点:

1、模板方法模式是通过把不变行为搬移到超类中,去除子类中的重复代码来体现它的优势;

2、模板方法模式就是提供了一个很好的代码复用平台;有时候我们会遇到一系列步骤构成的过程需要执行,这个过程从高层次上看是相同的,但是有些步骤的实现可能不同。

3、当不变的和可变的行为在方法子类实现中混合在一起的时候,不变的行为就会在子类中重复出现,我们通过模板方法模式把这些行为搬移到单一的地方,这样就可以帮助子类摆脱重复的不变行为的纠缠。

优点:

1、封装不变部分,扩展可变部分。

2、提取公共代码,便于维护。

3、行为由父类控制,子类实现。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

使用场景:

1、有多个子类共有的方法,且逻辑相同。

2、重要的、复杂的方法,可以考虑作为模板方法。

注意事项:为防止恶意操作,一般模板方法都加上 final 关键词。

时间: 2024-07-30 13:51:43

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

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)

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