14.行为型 - 模板方法模式 (Template)

1.定义

  • 定义一个抽象算法流程,将具体实现延迟到子类
  • 应该很广泛,比如生命周期方法、Android中异步任务AsyncTask等

2.UML类图

在这里插入图片描述

  • 角色介绍
    AbstrateTemplate : 模板抽象类,定义一套流程
    ConcreteA : 具体实现类
    ConcreteB : 具体实现类
  • 要点
    流程方法execute()通常用final关键字修饰,表示不可重新定义

3.UML示例代码

/**
 * Copyright (C), 2016-2020
 * FileName: AbstractTemplate
 * Author: wei.zheng
 * Date: 2019/12/18 9:48
 * Description: 模板抽象类
 */
public abstract class AbstractTemplate {
    public final void execute() {
        stepOne();
        stepTwo();
        stepThree();
    }

    protected void stepOne() {
        System.out.println("stepOne");
    }

    protected void stepTwo() {
        System.out.println("stepTwo");
    }

    protected void stepThree() {
        System.out.println("stepThree");
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: ConcreteA
 * Author: wei.zheng
 * Date: 2019/12/18 21:14
 * Description: ConcreteA 具体实现A, 可以覆盖各个流程方法
 */
public class ConcreteA extends AbstractTemplate {
    @Override
    protected void stepOne() {
        System.out.println("ConcreteA stepOne");
    }

    @Override
    protected void stepTwo() {
        System.out.println("ConcreteA stepTwo");
    }

    @Override
    protected void stepThree() {
        System.out.println("ConcreteA stepThree");
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: ConcreteB
 * Author: wei.zheng
 * Date: 2019/12/18 21:15
 * Description: ConcreteB 具体实现B
 */
public class ConcreteB extends AbstractTemplate {
    @Override
    protected void stepOne() {
        System.out.println("ConcreteB stepOne");
    }

    @Override
    protected void stepTwo() {
        System.out.println("ConcreteB stepTwo");
    }

    @Override
    protected void stepThree() {
        System.out.println("ConcreteB stepThree");
    }
}
/**
 * Copyright (C), 2016-2020
 * FileName: Client
 * Author: wei.zheng
 * Date: 2019/12/18 21:19
 * Description: 模板方法模式用户类
 */
public class Client {
    public static void main(String[] args) {
        ConcreteA concreteA = new ConcreteA();
        ConcreteB concreteB = new ConcreteB();

        // 流程一样,但是两个类具体实现不同
        concreteA.execute();
        concreteB.execute();
    }
}
// 运行结果
2019-12-18 21:22:25.917 4811-4811/? I/System.out: ConcreteA stepOne
2019-12-18 21:22:25.918 4811-4811/? I/System.out: ConcreteA stepTwo
2019-12-18 21:22:25.918 4811-4811/? I/System.out: ConcreteA stepThree
2019-12-18 21:22:25.918 4811-4811/? I/System.out: ConcreteB stepOne
2019-12-18 21:22:25.918 4811-4811/? I/System.out: ConcreteB stepTwo
2019-12-18 21:22:25.918 4811-4811/? I/System.out: ConcreteB stepThree

4.总结

模板方法的核心是封装流程,并将具体实现延迟到子类实现。

  • 优缺点
    优点:抽象公共代码,封装流程(不变),扩展实现(可变)
    缺点:具体实现类是继承关系,影响阅读难度(习惯就好)
发布了37 篇原创文章 · 获赞 0 · 访问量 570

猜你喜欢

转载自blog.csdn.net/qq_37514242/article/details/103605180