• 行为型设计模式之模板方法模式


    模板方法模式

    模板方法模式属于行为型设计模式。它是指定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

    模板方法模式实际上是封装了一个固定流程,该流程由几个步骤组成,具体步骤可以由子类进行不同实现,从而让固定的流程产生不同的结果。

    模板方法模式的本质是抽象封装流程,具体进行实现。

    应用场景

    当完成一个操作具有固定的流程时,由抽象固定流程步骤,具体步骤交给子类进行具体实现(固定的流程,不同的实现)。

    1.实现一个算法的不变的部分(子类共有方法),将可变的行为留给子类来实现。

    2.各子类中公共的行为被提取出来并集中到一个公共的父类中,以而避免代码重复。

    比如:入职资料的填写,通常会有一系列的流程,只需要按照流程规则一步一步做即可。是目标方法模式的体现。

    主要角色

    1.抽象模板(AbstractClass)

    抽象模板类,定义了一套算法框架/流程。

    2.具体实现(ConcreteClass)

    具体实现类,对算法框架/流程的某些步进行了实现。

    在这里插入图片描述

    优缺点

    1.将相同处理逻辑代码放到抽象父类中,提高代码的复用性。
    
    2.将不同代码放到不同子类中,通过对子类的扩展增加新的行为,提高代码的扩展性。
    
    3.把不变的行为写在父类上,去除子类的重复代码,提供了一个很好的代码复用平台,符合开闭原则
    
    • 1
    • 2
    • 3
    • 4
    • 5

    缺点

    1.类数目的增加,每个抽象类都需要一个子类来实现,这样导致类的个数增加。
    
    2.类数量的增加,间接地增加了系统实现的复杂度。
    
    3.继承关系自身缺点,如果父类添加新的抽象方法,所有子类都要改一遍。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    模板方法模式的基本使用

    创建抽象模板角色

    public abstract class AbstractClass {
        protected void step1() {
            System.out.println("AbstractClass:step1--->准备入职材料");
        }
    
        protected void step2() {
            System.out.println("AbstractClass:step2--->填写入职登记信息");
        }
    
        protected void step3() {
            System.out.println("AbstractClass:step3--->签订劳动合同");
        }
    
        protected void step4() {
            System.out.println("AbstractClass:step4--->办理工牌,安排工位");
        }
    
        public final void templateMehthod() {
            this.step1();
            this.step2();
            this.step3();
            this.step4();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    创建具体实现

    public class ConcreteClassA extends AbstractClass {
        @Override
        protected void step1() {
            System.out.println("ConcreateClassA:step1--->普通员工 准备入职材料");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    public class ConcreteClassB extends AbstractClass {
        @Override
        protected void step1() {
            System.out.println("ConcreateClassA:step1--->关系户 准备入职材料");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    客户端调用

        public static void main(String[] args) {
            System.out.println("--------------普通人入职------------");
            AbstractClass abcA = new ConcreteClassA();
            abcA.templateMehthod();
    
            System.out.println("--------------关系户入职------------");
            AbstractClass  abcB = new ConcreteClassB();
            abcB.step3();
            abcB.step4();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    --------------普通人入职------------
    ConcreateClassA:step1--->普通员工 准备入职材料
    AbstractClass:step2--->填写入职登记信息
    AbstractClass:step3--->签订劳动合同
    AbstractClass:step4--->办理工牌,安排工位
    --------------关系户入职------------
    AbstractClass:step3--->签订劳动合同
    AbstractClass:step4--->办理工牌,安排工位
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    【Flask框架②】——第一个Flask项目
    批量更改文件名称
    传递参数data与params的区别
    数字孪生云渲染整体架构设计
    聚观早报 | 白酒品牌频跨界;微软发布统一版本Copilot
    行内元素和块级元素的区别
    深入浅出排序算法之计数排序
    总结CSS常用的知识点以及SCSS语法
    周报、月报有多折磨人?万能报表模板建议收藏!(附模板)
    既能够用ffmpeg命令做RTSP流转RTMP流,又可以像调用avcodec/avfilter库一样逻辑编程
  • 原文地址:https://blog.csdn.net/qq_38628046/article/details/126195820