Java设计模式之模板方法模式(UML类图分析+代码详解)

26 篇文章 8 订阅
订阅专栏

大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~

希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!!

加油吧!未来可期!!

本文将介绍java 设计模式之模板方法模式

案例引入

豆浆制作问题:编写制作豆浆的程序,说明如下:

1) 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎

2) 通过添加不同的配料,可以制作出不同口味的豆浆

3) 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的

4) 请使用 模板方法模式 完成 (说明:因为模板方法模式,比较简单,很容易就 想到这个方案,因此就直接使用,不再使用传统的方案来引出模板方法模式 )

模板方法模式基本介绍

1) 模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),z 在一个抽象类公开定义了执行它的方法的模板它的子类可以按需要重写方法 实现,但调用将以抽象类中定义的方式进行

2) 简单说,模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子 类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定 步骤

3) 这种类型的设计模式属于行为型模式

模板方法模式的原理类图

对原理类图的说明-即(模板方法模式的角色及职责)

1) AbstractClass 抽象类, 类中实现了模板方法(template),定义了算法的骨 架,具体子类需要去实现 其它的抽象方法operationr2,3,4

2) ConcreteClass 实现抽象方法operationr2,3,4, 以完成算法中特点子类的步骤

模板方法模式解决豆浆制作问题

1) 应用实例要求 编写制作豆浆的程序,说明如下:

• 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 • 通过添加不同的配料,可以制作出不同口味的豆浆 • 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红 豆、花生豆浆等等)

2) 思路分析和图解(类图)

3) 代码实现 

package template;/* <---这是包名
-*- coding:utf-8 -*-
作者:bob-coding
日期:2022年10月18日11:10
敲码百遍,其意多见!!冲冲冲!!!*/

public class Template {
    public static void main(String[] args) {

        System.out.println("----制作红豆豆浆----");
        SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
        redBeanSoyaMilk.make();

        System.out.println("----制作花生豆浆----");
        SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
        peanutSoyaMilk.make();
    }
}

class RedBeanSoyaMilk extends SoyaMilk {

    @Override
    void addCondiments() {
        System.out.println(" 加入上好的红豆 ");
    }
}

class PeanutSoyaMilk extends SoyaMilk {

    @Override
    void addCondiments() {
        System.out.println(" 加入上好的花生 ");
    }
}

//抽象类,表示豆浆
abstract class SoyaMilk {

    //模板方法, make , 模板方法可以做成final , 不让子类去覆盖.
    final void make() {

        select();
        addCondiments();
        soak();
        beat();

    }

    //选材料
    void select() {
        System.out.println("第一步:选择好的新鲜黄豆  ");
    }

    //添加不同的配料, 抽象方法, 子类具体实现
    abstract void addCondiments();

    //浸泡
    void soak() {
        System.out.println("第三步, 黄豆和配料开始浸泡, 需要3小时 ");
    }

    void beat() {
        System.out.println("第四步:黄豆和配料放到豆浆机去打碎  ");
    }
}


 模板方法模式的钩子方法

1) 在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以 视情况要不要覆盖它,该方法称为“钩子”

2) 使用上面做豆浆的例子,来使用钩子方法对前面的模板方法进行改造

3) 主要代码:

//钩子方法,决定是否需要添加配料
boolean customerWantCondiments() {
    return true;
}
@Override
boolean customerWantCondiments(){
    return false;
}
package template2;/* <---这是包名
-*- coding:utf-8 -*-
作者:bob-coding
日期:2022年10月18日11:40
敲码百遍,其意多见!!冲冲冲!!!*/

public class Template {
    public static void main(String[] args) {

        System.out.println("----制作红豆豆浆----");
        SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
        redBeanSoyaMilk.make();

        System.out.println("----制作花生豆浆----");
        SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
        peanutSoyaMilk.make();

        System.out.println("----制作纯豆浆----");
        SoyaMilk pureSoyaMilk  = new PureSoyaMilk();
        pureSoyaMilk.make();
    }
}

class PureSoyaMilk extends SoyaMilk{

    @Override
    void addCondiments() {

    }

    @Override
    boolean customerWantCondiments(){
        return false;
    }
}

class RedBeanSoyaMilk extends SoyaMilk {

    @Override
    void addCondiments() {
        System.out.println(" 加入上好的红豆 ");
    }
}

class PeanutSoyaMilk extends SoyaMilk {

    @Override
    void addCondiments() {
        System.out.println(" 加入上好的花生 ");
    }
}

//抽象类,表示豆浆
abstract class SoyaMilk {

    //模板方法, make , 模板方法可以做成final , 不让子类去覆盖.
    final void make() {

        select();
        addCondiments();
        soak();
        beat();

    }

    //选材料
    void select() {
        System.out.println("第一步:选择好的新鲜黄豆  ");
    }

    //添加不同的配料, 抽象方法, 子类具体实现
    abstract void addCondiments();

    //浸泡
    void soak() {
        System.out.println("第三步, 黄豆和配料开始浸泡, 需要3小时 ");
    }

    void beat() {
        System.out.println("第四步:黄豆和配料放到豆浆机去打碎  ");
    }

    //钩子方法,决定是否需要添加配料
    boolean customerWantCondiments() {
        return true;
    }
}


模板方法模式在Spring框架应用的源码分析

1) Spring IOC容器初始化时运用到的模板方法模式

2) 代码分析+角色分析+说明类图

 

模板方法模式的注意事项和细节

1) 基本思想是:算法只存在于一个地方,也就是在父类中,容易修改。需要修改算 法时,只要修改父类的模板方法或者已经实现的某些步骤,子类就会继承这些修改

2) 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接 使用。

3) 既统一了算法,也提供了很大的灵活性。父类的模板方法确保了算法的结构保持不 变,同时由子类提供部分步骤的实现

4) 该模式的不足之处:每一个不同的实现都需要一个子类实现,导致类的个数增加, 使得系统更加庞大

5) 一般模板方法都加上final关键字, 防止子类重写模板方法.

6) 模板方法模式使用场景:当要完成在某个过程,该过程要执行一系列步骤 ,这一 系列的步骤基本相同,但其个别步骤在实现时 可能不同,通常考虑用模板方法模 式来处理.

模板模式 (Template Method Pattern)
11-01 304
一、什么是模板 既然是模板设计思维,那首先要探索一下到底何为模板,搞清楚现实中模板是啥样的,才能进一步把模板抽象化。 一提到模板,我最先想到的是PowerPoint,没错,就是让人头疼的PPT,马上要述职汇报了,PPT确实让人头大~ 人事的小姐姐已经把汇报的ppt模板发给我们了,我看了下汇报流程,如下: 不管你是张三、李四还是王五,都要按照这4个方...
Java中的模板方法模式
最佳 Java 编程
06-13 838
模板方法模式是一种行为模式,建议在超类中更一般地定义算法。 该算法是在称为模板方法方法中定义的。 子类仅定义更具体的算法步骤的实现。 使用这种设计模式的好处是,算法后面的任何更改只会影响超类中的代码。 此外,它还可以提高代码的可重用性。 在本快速教程中,我们将学习Java中实现模板方法模式模板方法模式: 假设我们必须写一篇文章。 通常涉及几个步骤: 专题研究 勾...
15.模板方法模式
weixin_43719015的博客
03-01 375
豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎,流程是固定的,只是其中的某一步骤是不一样的 通过添加不同的配料,可以制作出不同口味的豆浆 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的 请使用 模板方法模式 完成 (说明:因为模板方法模式,比较简单, 很容易就想到这个方案,因此就直接使用,不再使用传...
模板方法模式-Template Method Pattern
心猿意碼
07-09 3704
目录 模式的定义与特点 模式的结构与实现 模式的应用实例 模式的应用场景 模式的扩展 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。 例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队...
模板模式(Template Method Pattern)
qq_21344887的博客
09-28 347
模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式UML Class Diagram 实现代码 package engineering.papers; /** * Created by DELL * Date: 2019/9/28. * Ti...
模板方法模式【Template Method Pattern】
美丽心情
08-26 361
模板方法模式【Template Method Pattern】 周三,9:00,我刚刚坐到位置,打开电脑准备开始干活。 “小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑。还不等大家坐稳,老大就开讲了, “告诉大家一个好消息,昨天终于把牛叉模型公司的口子打开了,要我们做悍马模型,虽然是第一个车辆模型,但是我们有能力,有信心做好,我们一定要…(中间省略20 分钟的讲话,如果你
设计模式之结构型模式uml类图EA文件.rar
12-15
桥接模式之消息发送、适配器模式之购物车商品推荐、装饰者模式之相亲(男人的描述)、组合模式之对购物网站、享元模式之网店模板
设计模式之行为型模式uml类图EA文件.rar
12-15
职责链模式来模拟下达作战命令、组合命令模式实现多功能开关、中介者模式来说明联合国的作用、享元模式和备忘录模式模拟多次悔棋功能、观发者模式和中介者模式设计并实现给所有盟友发送通知,盟友收到通知后将做出...
设计模式】各个设计模式UML类图
06-14
设计模式】各个设计模式UML类图
在这里23种经典设计模式UML类图汇总
02-26
麦当劳和肯德基就是生产鸡翅的Factory工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何...
设计模式UML结构、类图分析设计模式案例
06-21
设计模式UML结构、类图分析设计模式案例
模板方法模式---Template Method Pattern
时光里的博客
08-13 142
模板方法 定义: - 模板方法(Template Method)模式:定义一个操作中的算法的骨架,而将一些步骤延 迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 - 这里的算法的结构,可以理解为你根据需求设计出来的业务流程。特定的步骤就是指那些可能在 内容上存在变数的环节。 可以看出来,模板方法模式也是为了巧妙解决变化对系统带来的影响而设计的。使用模 板方法使系统扩展性增强,最小化了变化对系统的影响 日常生活中的模板方法: 造房时,地基、走线、水管都一样,只有在建
模板方法模式(Template Method Pattern)。
孤芳不自赏
07-20 1191
定义: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 注意:为了防止恶意的操作,一般模板方法都加上final关键字,不允许被覆写。 通用代码: 抽象模板类 它的方法分为两类: 基本方法 基本方法也叫作基本操作,是由子类实现的方法,并且在模板方法被调用。 模板方法 可以有一个或几个,一般是一个具体方法,也就是一个...
模板方法模式
Charge8的博客
12-09 6549
一、模板方法模式 1、模板方法模式 模板方法(Template Method)模式,又称为模板模式,定义如下: 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。 2、模板方法模式的结构 模板方法模式需要注意抽象类与具体子类之间的协作。 它用到了虚函数的多态性技术以及“不用调用我,让我来调用你”的反向控制技术。 1. 模板方法模式包含以下主要角色: (1)抽象类/抽象模板(Abstract Class) 抽象模
模板方法模式(Template Method Pattern)
慕白Lee的博客
09-05 238
定义:Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's struct...
模板方法模式(Template Method Pattern)
jiangxinyu的专栏
02-06 1076
设计模式 - 吕震宇 .NET设计模式系列文章 薛敬明的专栏 乐在其中设计模式(C#) 设计模式(21)-Template Method Pattern 一、 模板方法(Template Method)模式 准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩
单例模式+uml类图
最新发布
12-28
单例模式是一种设计模式,它确保一个类只能创建一个对象。在单例模式中,类的实例被限制为一个,并且可以全局访问。这在需要共享资源或限制对象创建的情况下非常有用。 下面是一个使用单例模式的示例代码: ```python class Singleton: __instance = None @staticmethod def getInstance(): if Singleton.__instance == None: Singleton() return Singleton.__instance def __init__(self): if Singleton.__instance != None: raise Exception("This class is a singleton!") else: Singleton.__instance = self # 使用单例模式创建对象 obj1 = Singleton.getInstance() obj2 = Singleton.getInstance() print(obj1 is obj2) # 输出:True,obj1和obj2是同一个对象 ``` 上述代码中,`Singleton`类的`getInstance`方法用于获取类的唯一实例。如果实例不存在,则创建一个新实例并将其存储在`__instance`变量中。如果实例已经存在,则直接返回该实例。 UML类图是一种用于可视化类之间关系的图表。在类图中,可以明确表示类、接口、属性、方法以及类之间的关系。下面是一个使用UML类图表示单例模式的示例: ``` +--+ | Singleton | +--+ | - __instance: Singleton | +--+ | + getInstance(): Singleton | | - __init__() | +--+ ``` 在上述UML类图中,`Singleton`类具有一个私有的`__instance`变量,用于存储类的唯一实例。`getInstance`方法用于获取该实例。`__init__`方法是私有的,确保只能通过`getInstance`方法创建实例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Java设计模式之策略模式(UML类图分析+代码详解) 5152
  • Java设计模式之责任链模式(UML类图分析+代码详解) 3938
  • Java设计模式之状态模式(UML类图分析+代码详解) 3892
  • Java设计模式之命令模式(UML类图分析+代码详解) 3102
  • controller层配置全局配置拦截器 3101

分类专栏

  • 项目经验 8篇
  • java设计模式 26篇
  • Redis 3篇
  • python 1篇
  • Java基础 1篇
  • c语言数据结构学习 3篇
  • Java EE 1篇
  • 算法学习 6篇

最新评论

  • Java设计模式之享元模式(UML类图分析+代码详解)

    敲键盘的小夜猫: 这篇博客真是写得太棒了!让读者能够从中获取丰富的知识和灵感。 【我也写了一些相关领域的文章,希望能够得到博主的指导,共同进步!】

  • 基于python的师生一体化学生信息管理系统——python期末设计!!!

    一斤半两: 博主,你好,我管理员登录之后提示数据库连接失败是什么原因呢

  • 基于python的师生一体化学生信息管理系统——python期末设计!!!

    bobcoding: 看一下数据库的配置文件,还有密码什么的,报错信息发一下

  • 基于python的师生一体化学生信息管理系统——python期末设计!!!

    m0_74964646: 为什么数据库连接失败呀呜呜呜

  • 基于python的师生一体化学生信息管理系统——python期末设计!!!

    bobcoding: 可以了,你有什么问题私聊一下我

大家在看

  • 「Daily OI Round 4」Snow(贪心+模拟) 221

最新文章

  • MySQL远程操作相关配置
  • 在Java中操作Jedis_Jedis和SpringDataRedis
  • Redis的数据类型、常用命令
2022年49篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源灭门惨案借种傲斗凌天2.0好看的后宫小说刘姓起什么名好sis001!board-[第一会所邀请注册]科技通讯公司起名起名字带萧好不好金碧辉煌求生一加一游戏名字怎么起不可思议的生物家政起名招财的名字湖北大学地址邮编冒险王卫斯理之蓝血人赢在起跑线的名言美女圣约书给宝宝起名字姓徐起名学实用大全下载想给公司起个名字越狱第五季男孩起名高一感恩父母作文小家碧玉hvisio比熊起上档次名字设置电脑自动关机fm2012下载要锦起名字姓郭取名起名蜈蚣怕什么淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化