设计模式之美
王争
前Google工程师,《数据结构与算法之美》专栏作者
立即订阅
21314 人已学习
课程目录
已更新 66 讲 / 共 100 讲
0/6登录后,你可以任选6讲全文学习。
开篇词 (1讲)
开篇词 | 一对一的设计与编码集训,让你告别没有成长的烂代码!
免费
设计模式学习导读 (3讲)
01 | 为什么说每个程序员都要尽早地学习并掌握设计模式相关知识?
02 | 从哪些维度评判代码质量的好坏?如何具备写出高质量代码的能力?
03 | 面向对象、设计原则、设计模式、编程规范、重构,这五者有何关系?
设计原则与思想:面向对象 (11讲)
04 | 理论一:当谈论面向对象的时候,我们到底在谈论什么?
05 | 理论二:封装、抽象、继承、多态分别可以解决哪些编程问题?
06 | 理论三:面向对象相比面向过程有哪些优势?面向过程真的过时了吗?
07 | 理论四:哪些代码设计看似是面向对象,实际是面向过程的?
08 | 理论五:接口vs抽象类的区别?如何用普通的类模拟抽象类和接口?
09 | 理论六:为什么基于接口而非实现编程?有必要为每个类都定义接口吗?
10 | 理论七:为何说要多用组合少用继承?如何决定该用组合还是继承?
11 | 实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?
12 | 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?
13 | 实战二(上):如何对接口鉴权这样一个功能开发做面向对象分析?
14 | 实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?
设计原则与思想:设计原则 (12讲)
15 | 理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?
16 | 理论二:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?
17 | 理论三:里式替换(LSP)跟多态有何区别?哪些代码违背了LSP?
18 | 理论四:接口隔离原则有哪三种应用?原则中的“接口”该如何理解?
19 | 理论五:控制反转、依赖反转、依赖注入,这三者有何区别和联系?
20 | 理论六:我为何说KISS、YAGNI原则看似简单,却经常被用错?
21 | 理论七:重复的代码就一定违背DRY吗?如何提高代码的复用性?
22 | 理论八:如何用迪米特法则(LOD)实现“高内聚、松耦合”?
23 | 实战一(上):针对业务系统的开发,如何做需求分析和设计?
24 | 实战一(下):如何实现一个遵从设计原则的积分兑换系统?
25 | 实战二(上):针对非业务的通用框架开发,如何做需求分析和设计?
26 | 实战二(下):如何实现一个支持各种统计规则的性能计数器?
设计原则与思想:规范与重构 (11讲)
27 | 理论一:什么情况下要重构?到底重构什么?又该如何重构?
28 | 理论二:为了保证重构不出错,有哪些非常能落地的技术手段?
29 | 理论三:什么是代码的可测试性?如何写出可测试性好的代码?
30 | 理论四:如何通过封装、抽象、模块化、中间层等解耦代码?
31 | 理论五:让你最快速地改善代码质量的20条编程规范(上)
32 | 理论五:让你最快速地改善代码质量的20条编程规范(中)
33 | 理论五:让你最快速地改善代码质量的20条编程规范(下)
34 | 实战一(上):通过一段ID生成器代码,学习如何发现代码质量问题
35 | 实战一(下):手把手带你将ID生成器代码从“能用”重构为“好用”
36 | 实战二(上):程序出错该返回啥?NULL、异常、错误码、空对象?
37 | 实战二(下):重构ID生成器项目中各函数的异常处理代码
设计原则与思想:总结课 (3讲)
38 | 总结回顾面向对象、设计原则、编程规范、重构技巧等知识点
39 | 运用学过的设计原则和思想完善之前讲的性能计数器项目(上)
40 | 运用学过的设计原则和思想完善之前讲的性能计数器项目(下)
设计模式与范式:创建型 (7讲)
41 | 单例模式(上):为什么说支持懒加载的双重检测不比饿汉式更优?
42 | 单例模式(中):我为什么不推荐使用单例模式?又有何替代方案?
43 | 单例模式(下):如何设计实现一个集群环境下的分布式单例模式?
44 | 工厂模式(上):我为什么说没事不要随便用工厂模式创建对象?
45 | 工厂模式(下):如何设计实现一个Dependency Injection框架?
46 | 建造者模式:详解构造函数、set方法、建造者模式三种对象创建方式
47 | 原型模式:如何最快速地clone一个HashMap散列表?
设计模式与范式:结构型 (8讲)
48 | 代理模式:代理在RPC、缓存、监控等场景中的应用
49 | 桥接模式:如何实现支持不同类型和渠道的消息推送系统?
50 | 装饰器模式:通过剖析Java IO类库源码学习装饰器模式
51 | 适配器模式:代理、适配器、桥接、装饰,这四个模式有何区别?
52 | 门面模式:如何设计合理的接口粒度以兼顾接口的易用性和通用性?
53 | 组合模式:如何设计实现支持递归遍历的文件系统目录树结构?
54 | 享元模式(上):如何利用享元模式优化文本编辑器的内存占用?
55 | 享元模式(下):剖析享元模式在Java Integer、String中的应用
设计模式与范式:行为型 (7讲)
56 | 观察者模式(上):详解各种应用场景下观察者模式的不同实现方式
57 | 观察者模式(下):如何实现一个异步非阻塞的EventBus框架?
58 | 模板模式(上):剖析模板模式在JDK、Servlet、JUnit等中的应用
59 | 模板模式(下):模板模式与Callback回调函数有何区别和联系?
60 | 策略模式(上):如何避免冗长的if-else/switch分支判断代码?
61 | 策略模式(下):如何实现一个支持给不同大小文件排序的小程序?
62 | 职责链模式(上):如何实现可灵活扩展算法的敏感信息过滤框架?
不定期加餐 (3讲)
加餐一 | 用一篇文章带你了解专栏中用到的所有Java语法
加餐二 | 设计模式、重构、编程规范等相关书籍推荐
春节特别加餐 | 王争:如何学习《设计模式之美》专栏?
免费
设计模式之美
登录|注册

58 | 模板模式(上):剖析模板模式在JDK、Servlet、JUnit等中的应用

王争 2020-03-16
上两节课我们学习了第一个行为型设计模式,观察者模式。针对不同的应用场景,我们讲解了不同的实现方式,有同步阻塞、异步非阻塞的实现方式,也有进程内、进程间的实现方式。除此之外,我还带你手把手实现了一个简单的 EventBus 框架。
今天,我们再学习另外一种行为型设计模式,模板模式。我们多次强调,绝大部分设计模式的原理和实现,都非常简单,难的是掌握应用场景,搞清楚能解决什么问题。模板模式也不例外。模板模式主要是用来解决复用和扩展两个问题。我们今天会结合 Java Servlet、JUnit TestCase、Java InputStream、Java AbstractList 四个例子来具体讲解这两个作用。
话不多说,让我们正式开始今天的学习吧!

模板模式的原理与实现

模板模式,全称是模板方法设计模式,英文是 Template Method Design Pattern。在 GoF 的《设计模式》一书中,它是这么定义的:
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 structure.
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《设计模式之美》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(50)

  • 攻城拔寨
    文末的问题,在 spring 生命周期中,InstantiationAwareBeanPostProcessorAdapter
    就是解决这个问题的。
    写个适配器,把所有抽象方法默认实现一下,子类继承这个 adapter 就行了。
    2020-03-17
    14
  • rayjun
    如果两个模版方法没有耦合,可以拆分成两个类,如果不能拆分,那就为每个方法提供默认实现
    2020-03-16
    13
  • 小兵
    父类中不用抽象方法,提供一个空的实现,子类根据需要重写。
    2020-03-16
    2
    10
  • Geek_11
    争哥,一年前就很崇拜你了,但是现在很迷茫,三年的开发经验了,一直在小公司,做的项目最多的数据量也只是十几万的用户,平常下班每天都会坚持学习两个小时,已经坚持一年半了,看了数据结构和算法,还有认真刷过题,看了网络协议,也看了框架方面的书等等,也认真做了笔记,然后想投递独角兽公司,但是简历都不通过,理由是学历和项目都没有亮点,我是本科毕业,看了网上的一些阿里或者百度这样的公司的面试题,发现自己也会,但是投递的简历都不通过,真的很迷茫,不知道这样的坚持有没有用,现在想回到老家一个二线城市,做着一份养老的工作
    2020-03-17
    8
    7
  • Eclipse
    可以借鉴AbstractList的addall实现。提供默认的方法method1...method4方法,每个方法直接抛出异常,使用模板方法的时候强制重写用到的method方法,用不到的method不用重写。
    2020-03-16
    6
  • 下雨天
    课后思考:
    一. 能修改框架代码情况:
    定义一个父类,给不需要调用的抽象方法一个默认实现,子类继承该父类。

    二. 如果可以修改框架代码的情况下:
    1.templateMethod1与templateMethod2相关:可以将不需要调用的方法修改成protected并提供默认空实现。
    2.templateMethod1与templateMethod2不相关:接口隔离原则,考虑将AbstractClass拆分成两个类分别定义两个方法。
    2020-03-16
    4
  • tt
    参考装饰器模式那一课中JAVA IO类库中的做法,引入一个中间父类,实现所有的抽象方法,然后再让业务类去继承这个中间的父类。
    2020-03-17
    2
  • 宁锟
    定义两个抽象类,继承模板类,分别给不需要的方法定义空实现
    2020-03-16
    2
  • 每天晒白牙
    提供一个 Base 类,实现 method1 到 method4 的所有抽象方法,然后子类继承 Base 类,一般可以直接复用 Base 类中的 method1 到 method4 方法,如果需要重写,直接重写该方法就好。这样就能省去所有子类实现所有抽象方法

    继承抽象方法的基类 Base
    public class Base extends AbstractClass {
        @Override
        protected void method1() {
            System.out.println("1");
        }

        @Override
        protected void method2() {
            System.out.println("2");
        }

        @Override
        protected void method3() {
            System.out.println("3");
        }

        @Override
        protected void method4() {
            System.out.println("4");
        }
    }

    子类 A 需要重写 method1 方法
    public class SubA extends Base {

        // 只需要重写 method1
        @Override
        public void method1() {
            System.out.println("重写 method1");
        }

        public static void main(String[] args) {
            Base A = new SubA();
            A.templateMethod1();
        }
    }

    输出结果为

    重写 method1
    2

    2020-03-16
    1
  • 付昱霖
    使用外观模式,用一个新类再次包装,只暴露需要的接口。
    2020-03-16
    1
  • 自来也
    Es框架里,abstractrunable是属于包装者还是模板。感觉更像包装者。不管啥了,总之觉得这样挺好用的。父类public就好了,就能解决没必要强制重写了。
    2020-03-16
    1
    1
  • 刘大明
    如果其他的类不考虑复用的话,可以将这些抽取成一个基类,就是两个抽象类。分别给不需要的方法定义空实现。
    2020-03-16
    1
  • LJK
    课后作业的思考:对于必须要子类实现的方法定义为抽象方法或throw Exception,对于变动比较少但是同时也不想失去扩展性的方法添加默认实现,调用时优先获取用户自定义方法,获取不到的情况下使用默认方法
    2020-03-16
    1
  • Sinclairs
    如果项目中多次用到这个类的话, 可以单独实现一个基类来继承这个模版类, 将不需要的扩展方法进行默认实现.
    项目开发中直接使用基类方法就好.
    2020-03-16
    1
  • 辣么大
    对于思考题,提供一个类有默认的实现,子类继承这个类即可。
    2020-03-24
  • 忆水寒
    可以使用一个类去继承实现这4个抽象函数(空实现)。然后有新的类只需要继承并重写其中一个方法即可。这个有点像适配器模式了
    2020-03-23
  • 葛强强
    根据类的单一职责原则,将抽象类拆分为两个抽象类。
    2020-03-23
  • Xs.Ten
    我想到两个方法,请老师指正:
    1.采用适配器模式;
    2.抽离成多个类;
    2020-03-23
  • Geek_54edc1
    思考题:根据接口隔离的原则,可以根据业务需求,将AbstractClass的接口进行拆分
    2020-03-22
  • Geek_3b1096
    最难的是掌握应用场景
    2020-03-22
收起评论
50
返回
顶部