【软件设计模式】详解模板方法设计模式

举报
huahua.Dr 发表于 2022/10/18 20:31:52 2022/10/18
【摘要】 1.什么是模板方法模式在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序。但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关。这是就可以定义一个轮廓和骨架(模板),由一个模板方法和多个基本方法构成,由具体实现类去将这些方法去填充,将这些方法延迟到具体的实际环境中,这就是模板方法模式。简单概括就是:定义了处理逻辑的骨...

1.什么是模板方法模式

在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序。但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关。这是就可以定义一个轮廓和骨架(模板),由一个模板方法和多个基本方法构成,由具体实现类去将这些方法去填充,将这些方法延迟到具体的实际环境中,这就是模板方法模式。

简单概括就是:定义了处理逻辑的骨架,按某种顺序调用其包含的基本方法。将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

他的结构如下:

1)抽象模板类,负责给出一个轮廓和骨架。它由一个模板方法和若干个基本方法构成。

包含以下几种类型的基本方法:

  • 抽象方法:只在抽象类中声明,交给具体子类去实现。
  • 具体方法:在抽象类中已经实现,子类可以继承或重写它。
  • 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。

2)具体子类/具体实现

具体实现类,实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤。

2.详解模板方法模式

1)模板方法模式是基于继承的代码复用基本技术,模板方法模式的结构和用法也是面向对象设计的核心之一。在模板方法模式中,可以将相同的代码放在父类中,而将不同的方法实现放在不同的子类中。

2)在模板方法模式中,我们需要准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来让子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现,这就是模板方法模式的用意。模板方法模式体现了面向对象的诸多重要思想,是一种使用频率较高的模式。

3.模板方法使用场景:

1) 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。

2)各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。

3)控制子类扩展。模板方法只在特定点调用“ hook”操作 ,这样就只允许在这些点进行扩展。

4.模板方法特点:

  • 把认为是不变部分封装到父类中实现,而把可变部分交由子类继承实现,便于子类继续扩展。
  • 在父类中提取了公共的部分代码,便于代码复用。
  • 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。

5.具体实现

模板方法结构图:

/**

 * 功能描述 模板方法

 *

 */

public class TemplateMethodPattern {

    public static void main(String[] args) {

        AbstractClass tm1 = new ConcreteOneClass();

        System.out.println("One Start");

        tm1.TemplateMethod();

        System.out.println("One End");

 

        AbstractClass tm2 = new ConcreteTwoClass();

        System.out.println("Two Start");

        tm2.TemplateMethod();

        System.out.println("Two End");

 

    }

}

 

//抽象类

abstract class AbstractClass {

    //模板方法,并给出处理逻辑,调用顺序

    public void TemplateMethod() {

        SpecificMethod();

        abstractMethod1();

        abstractMethod2();

    }

 

    //具体方法

    public void SpecificMethod() {

        System.out.println("抽象类中的具体方法被调用...");

    }

 

    //抽象方法1

    public abstract void abstractMethod1();

 

    //抽象方法2

    public abstract void abstractMethod2();

}

 

//具体子类1

class ConcreteOneClass extends AbstractClass {

    public void abstractMethod1() {

        System.out.println("抽象方法1的{ConcreteOneClass}实现被调用...");

    }

 

    public void abstractMethod2() {

        System.out.println("抽象方法2的{ConcreteOneClass}实现被调用...");

    }

}

 

//具体子类2

class ConcreteTwoClass extends AbstractClass {

    public void abstractMethod1() {

        System.out.println("抽象方法1的{ConcreteTwoClass}实现被调用...");

    }

 

    public void abstractMethod2() {

        System.out.println("抽象方法2的{ConcreteTwoClass}实现被调用...");

    }

}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。