21、设计模式之模板方法模式

2024-05-30 1734阅读

模板模式

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

21、设计模式之模板方法模式
(图片来源网络,侵删)

介绍

意图: 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

主要解决: 一些方法通用,却在每一个子类都重新写了这一方法。

何时使用: 有一些通用的方法。

如何解决: 将这些通用算法抽象出来。

关键代码: 在抽象类实现,其他步骤在子类实现。

应用实例:

  1. 在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。
  2. 西游记里面菩萨定好的 81 难,这就是一个顶层的逻辑骨架。
  3. spring 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开启事务、获取 Session、关闭 Session 等,程序员不重复写那些已经规范好的代码,直接丢一个实体就可以保存。

优点:

  1. 封装不变部分,扩展可变部分。
  2. 提取公共代码,便于维护。
  3. 行为由父类控制,子类实现。

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

使用场景:

  1. 有多个子类共有的方法,且逻辑相同。
  2. 重要的、复杂的方法,可以考虑作为模板方法。

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

代码实现

做饭模版抽象类

public abstract class Cook {
    /**
     * 开火
     */
    public abstract void openFire();
    /**
     * 准备
     */
    public abstract void preparation();
    /**
     * 烧菜
     */
    public abstract void doDish();
    /**
     * 关火
     */
    public abstract void offFire();
    public void cook(){
        openFire();
        preparation();
        doDish();
        offFire();
    }
}

烧鸭

/**
 * 烧鸭
 */
public class DuckCook extends Cook{
    @Override
    public void openFire() {
        System.out.println("打开电饭煲");
    }
    @Override
    public void preparation() {
        System.out.println("准备鸭子一只");
    }
    @Override
    public void doDish() {
        System.out.println("开始煮鸭子");
    }
    @Override
    public void offFire() {
        System.out.println("关闭电饭煲");
    }
}

烧鸡

public class ChickenCook extends Cook{
    @Override
    public void openFire() {
        System.out.println("开小灶");
    }
    @Override
    public void preparation() {
        System.out.println("准备鸡");
    }
    @Override
    public void doDish() {
        System.out.println("做鸡");
    }
    @Override
    public void offFire() {
        System.out.println("关小灶");
    }
}

客户端

public class Client {
    public static void main(String[] args) {
        Cook cook = new DuckCook();
        cook.cook();
        cook = new ChickenCook();
        cook.cook();
    }
}
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]