最近看书又遇到模板方法模式,具体是在同步器(AQS)的内容上。就顺便再来回顾下。

同步器AbstractQueuedSynchronizer(AQS)是一个抽象类。其中定义了           基本方法         和            模板方法。

--  基本方法都是抽象方法,需要在子类中去具体实现。

--  模板方法已经有具体的实现,模板方法中会对基本方法进行顺序调用。

综上,模板方法模式:在类中的模板方法方法中,对类中的其他基本方法进行定义好的规则、顺序进行调用执行。

光看文字有些绕,还是看代码会清晰一些。

public abstract class Parent {

    //基本方法
    public abstract void get();
    public abstract void set();
    //模板方法,已经定义了基本方法的调用顺序规则
    public void excute() {
        get();
        set();
    }
}
public class Child1 extends Parent{
    @Override
    public void get() {
        System.out.println("get-child1");
    }
    @Override
    public void set() {
        System.out.println("set-child1");
    }
}
public class Child2 extends Parent{
    @Override
    public void get() {
        System.out.println("get-child2");
    }
    @Override
    public void set() {
        System.out.println("set-child2");
    }
}

=====================================

理论概括一下:【复制来源:参考文章】

作者:我是皮皮甜大王
链接:https://www.jianshu.com/p/f8e48d0944c8
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

(一)什么是模板方法模式
    一个操作中的算法框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构就可以定义该算法的某些特定步骤。有些抽象,等下举个例子会更明白。

(二)模板方法模式的使用:抽象类抽象子类共性+子类继承重写抽象方法

(三)模板方法模式的优点
           1)提取公共代码可以使核心代码变少,放在一起方便维护,想修改某个方法只需要修改一处就可以了

2)行为由父类控制,子类实现
                 自己的理解父类定义你有哪些行为,子类具体实现,其具体实现不关父类的事。就像小时候老妈喊你写完家庭作业,但是你具体怎么做并不会管,你是先写语文呢,还是先写数学呢
           3)封装不变部分,扩展可变部分

(四)使用场景
            1)多个子类有共有方法,并且逻辑基本相同时
            2)重构时,把相同的代码抽取到父类中,通过钩子函数约(钩子函数自我理解就是一个返回值为boolean的方法,通过返回值来控制其他行为,在抽象类中可以有默认实现)约束其行为
=====================================================

最新文章

  1. 了解Solr6.1结构及实现原理
  2. Javassist 字节码操作
  3. BZOJ 1003 物流运输【最短路】【动态规划】
  4. UWP/Win10新特性系列—Drag&Drop 拖动打开文件
  5. OpenCV Template Matching Subpixel Accuracy
  6. 每天记一些php函数,jQuery函数和linux命令(一)
  7. iOS 学习 - 10下载(2) NSURLSession 图片 篇
  8. js call
  9. Laravel教程 三:视图变量传递和Blade
  10. iOS 手势操作:拖动、捏合、旋转、点按、长按、轻扫、自定义
  11. Android 关于ExpandableListView控件setOnChildClickListener无效问题
  12. Wcf Client 异常和关闭的通用处理方法
  13. 【转】Fiddler 教程
  14. php生成百度站点地图sitemap.xml
  15. iOS 生成本地验证码
  16. C# 中的装箱与拆箱
  17. 前端之bootstrap模态框
  18. 移动端控制视频点击播放点击下一个视频时自动停止播放&监听滑动溢出屏幕高度时停止播放
  19. CH 5102Mobile Service题解
  20. Android主题切换

热门文章

  1. POJ 3304 Segments(判断直线与线段是否相交)
  2. mongodb学习(三)——函数使用的小技巧
  3. Map2Shp7专业版新增功能
  4. Scala与Mongodb实践4-----数据库操具体应用
  5. ReactNative: 将自定义的ReactNative组件制作成第三方库的详细流程(制作-->发布)
  6. 《C# 爬虫 破境之道》:第二境 爬虫应用 — 第一节:HTTP协议数据采集
  7. Webpack实战(五):轻松读懂Webpack如何分离样式文件
  8. python中常⽤的excel模块库
  9. Docker windows nano server容器中安装ssh实现远程登录管理
  10. (转) exp1-2://一次有趣的XSS漏洞挖掘分析(2)