当前时间: 2026-06-07 19:00:51
分类:办公文件
评论(0)
设计模式之模板方法模式目前为止,我们都是绕着封装转,封装了对象创建、方法调用、复杂接口…接下来,我们将要深入封装算法块,好让子类可以在任何时候都可以将自己挂接进运算里。我们来扮演"代码师傅",写一些代码来创建咖啡和茶,手册如下:一上来先不要着急地开始编写代码,首先来研究下茶和咖啡的类,然后绘制个类图看看: 嗯,再看一眼,我们是不是忽略了咖啡和茶的某些其他的共同点呢?两份冲泡法都采用了相同的算法:1.把水煮沸boilWater()与3.把饮料倒进杯子pourInCup() 这两个已经被抽出来,放到基类中了,2.用热水泡咖啡或茶 与4.在饮料内加入适当的调料 这两个并没有被抽出来,但是它们是一样的,只是应用在不同的饮料上。 那么,我们有办法将prepareRecipe()方法也抽象化吗?是的,现在就来看看该怎么做… 我们看到,浸泡(steep)和冲泡(brew)差异其实不大,我们可统一下名称为brew(),不管是泡茶或冲泡咖啡我们都用这个名称。类似地,加糖和牛奶也和加柠檬很相似:都是在饮料中加入调料,就统一叫做addCondiments(),如下图 现在我们有了新的prepareRecipe方法,但需要让它能够符合代码,我们还得继续来处理:新建个(咖啡因饮料)超类CaffeineBeverage,如下图 最后,我们需要处理咖啡和茶类了,这两个类都得依赖CaffeineBeverage超类来处理冲泡法,然后在各自子类中,自行去处理冲泡和添加调料部分啦基本上,我们刚刚实现的就是模板方法模式,我们来看看咖啡因饮料类 的结构,它包含了实际的"模板方法": 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。模板方法模式——定义一个算法的骨架(流程),把一些步骤延迟到子类中。模块方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 现在,我们开始来进行具体的操作泡口茶喝,可更好地了解下这个模板方法是如何进行工作的。 首先来创建一个咖啡因饮料超类CaffeineBeverage钩子是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在,可以让子类有能力对算法的不同点进行挂钩。至于要不要挂钩?由子类自行决定。那写一个看看: 好莱坞原则和模板方法之间的连接其实还算明显:当我们设计模板方法模式时,我们告诉子类,不要调用我们,我们会调用你。 1.当我创建一个模板方法时,怎么才能知道什么时候该使用抽象方法,什么时候使用钩子呢? 当你的子类"必须"提供算法中某个方法或步骤的实现时,就使用抽象方法。如果算法的这个部分是可选的,就用钩子。如果是钩子的话,子类可以选择实现这个上钩子。 2.好莱坞原则和依赖倒置原则(前面学的)之间的关系如何? 依赖倒置原则教我们尽量避免使用具体类,而多使用抽象,而好莱坞原则是用在创建框架或组件上的一种技巧,好让低层组件能够被挂钩进计算中,而且又不会让高层组件依赖低层组件。两者的目标都是在于解耦,但是依赖倒置原则更加注重如何在设计中避免依赖。 稍微总结下:模板方法是子类决定如何实现算法中的某些步骤,策略是封装可互换的行为,然后使用委托来决定要采用哪一个行为,工厂方法是哪个具体类,也就是策略模式和模板方法模式都封装算法,一个用组合,一个用继承,工厂方法是模板方法的一种特殊版本。 好了,模板方法模式的学习就到这里了,已学了九个,还有更多!
基本
文件
流程
错误
SQL
调试
- 请求信息 : 2026-06-08 11:07:04 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/724650.html
- 运行时间 : 0.220713s [ 吞吐率:4.53req/s ] 内存消耗:4,755.70kb 文件加载:145
- 缓存信息 : 0 reads,0 writes
- 会话信息 : SESSION_ID=aac35d7b4f6b6f8289385aa1588393a5
- CONNECT:[ UseTime:0.001114s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
- SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001658s ]
- SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000764s ]
- SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000634s ]
- SHOW FULL COLUMNS FROM `set` [ RunTime:0.001323s ]
- SELECT * FROM `set` [ RunTime:0.000566s ]
- SHOW FULL COLUMNS FROM `article` [ RunTime:0.001634s ]
- SELECT * FROM `article` WHERE `id` = 724650 LIMIT 1 [ RunTime:0.001036s ]
- UPDATE `article` SET `lasttime` = 1780888024 WHERE `id` = 724650 [ RunTime:0.026716s ]
- SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000658s ]
- SELECT * FROM `article` WHERE `id` < 724650 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001307s ]
- SELECT * FROM `article` WHERE `id` > 724650 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000837s ]
- SELECT * FROM `article` WHERE `id` < 724650 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001165s ]
- SELECT * FROM `article` WHERE `id` < 724650 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001033s ]
- SELECT * FROM `article` WHERE `id` < 724650 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.000701s ]
0.224700s