美文网首页
《读_Head_First_有感》_“模板方法模式”

《读_Head_First_有感》_“模板方法模式”

作者: tjhuey | 来源:发表于2018-09-04 11:29 被阅读12次

前言:
前沿技术一直在迭代,有一种东西是不会更新的,那就是设计模式的思想。 可以来学习学习设计模式的思维,巧妙设计!
外观模式就是整合多个对象到一个对象,对外暴露一个,常用接口简化!
模板模式,算法预定义,让真正的子类去实现自己的行为,请看源代码

[TOC]

1.官方话语

概述

设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。

六大原则:

单一职责原则 (Single ResponsiBility Principle) 概括:应该有且仅有一个原因引起类的变更
里氏替换原则(liskov Substitution Principle ) 概括:基类出现的地方,子类一定可以出现
依赖倒转原则(Depndece Inversion Principle) 概括:针对接口编程,依赖于抽象而不是具体
接口隔离原则(Interface Segregation Principle) 概括:使用多个隔离的接口,比使用单个接口好 (细分接口,降低耦合)
迪米特法则 (Demeter Principle) 概括:实体应当尽量少的与其他类发生互相作用,使得系统功能模块相对独立
开闭原则(Open Close Principle) 概括: 对扩展开放,对修改关闭
合成复用原则 (Composite Reuse Principle) 概括:尽量使用合成/聚合的方式,少用继承

个人话语

概述

设计模式在代码层级中,是让你在某种业务场景刚开始设计时,能让未来的相关需求扩展极为方便的一个思想。
简单的说,在一开始设计好,扩展是很方便的,设计模式就是这个功劳者
对于我们本来就懒的开发人员来说,这是求之不得的。

六大原则

而对于六大原则,简单过一下就行,不用刻意理解,如果你会了面向对象和设计模式的使用,自然就遵循了。

今日主题

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

场景:

看代码吧,如果你看过一些源码,联想一下你能想到的哦

概述:

代码如下

'模板模式'代码

 *
 * @author huey
 * @Description : 执行架构
 * @Date Created in 2018/9/2 10:50
 */
@FunctionalInterface
public interface MyExecutor {

    void exec(String param);
}


*
 * @author huey
 * @Description : 模板类
 * @Date Created in 2018/9/2 10:52
 */
@Slf4j
public abstract class MyAbstractExecuter implements MyExecutor {

    /**
     * @author huey
     * @Description : 模板方法
     * @Date Created in 2018/9/2 10:59
     */
    final public void prepare() {
        this.init();
        this.doAbsStractTask();
        if (this.isDoTask2()) {
            doAbsStractTask2();
        }
        this.destroy();
    }

    /**
     * @author huey
     * @Description : 具体执行
     * @Date Created in 2018/9/2 11:00
     */
    @Override
    public void exec(String param) {
        this.prepare();
        //其他
    }

    /**
     * @author huey
     * @Description : 具体任务
     * @Date Created in 2018/9/2 10:59
     */
    public void doAbsStractTask() {
        log.info("MyAbstractExecuter doAbsStractTask ...");
    }

    public void doAbsStractTask2() {
        log.info("MyAbstractExecuter doAbsStractTask2 ...");
    }

    /**
     * @author huey
     * @Description : 将具体初始化行为传给某具体子类
     * @Date Created in 2018/9/2 10:55
     */
    protected abstract void init();

    /**
     * @author huey
     * @Description : 将具体销毁行为传给某具体子类
     * @Date Created in 2018/9/2 10:55
     */
    protected abstract void destroy();

    /**
     * @author huey
     * @Description : 是否执行任务2 默认true 执行,俗称钩子,供子类是否重写
     * @Date Created in 2018/9/2 11:02
     */
    protected boolean isDoTask2() {
        return true;
    }
}

*
 * @author huey
 * @Description : 简单执行器
 * @Date Created in 2018/9/2 11:01
 */
@Slf4j
public class SimpleExecutor extends MyAbstractExecuter{
    /**
     * @author huey
     * @Description : 将具体初始化行为传给某具体子类
     * @Date Created in 2018/9/2 10:55
     */
    @Override
    protected void init() {
        log.info("SimpleExecutor init ");
    }

    /**
     * @author huey
     * @Description : 将具体销毁行为传给某具体子类
     * @Date Created in 2018/9/2 10:55
     */
    @Override
    protected void destroy() {
        log.info("SimpleExecutor destroy ");
    }
}
 *
 * @author huey
 * @Description : 默认执行器
 * @Date Created in 2018/9/2 11:00
 */
@Slf4j
public class DefaultExecutor extends MyAbstractExecuter {
    /**
     * @author huey
     * @Description : 将具体初始化行为传给某具体子类
     * @Date Created in 2018/9/2 10:55
     */
    @Override
    protected void init() {
        log.info("DefaultExecutor init ");
    }

    /**
     * @author huey
     * @Description : 将具体销毁行为传给某具体子类
     * @Date Created in 2018/9/2 10:55
     */
    @Override
    protected void destroy() {
        log.info("DefaultExecutor destroy ");
    }

    /**
     * @author huey
     * @Description : 是否执行任务2 默认true 执行,俗称钩子,供子类是否重写
     * @Date Created in 2018/9/2 11:02
     */
    @Override
    protected boolean isDoTask2() {
        //10是做着模拟的  逻辑判断
        int total = 10;
        if (total > 10) {
            return true;
        } else {
            return false;
        }
    }
}

 *
 * @author huey
 * @Description : 模板测试
 * @Date Created in 2018/9/2 11:07
 */
@Slf4j
public class TemplateTest {


    /**
     * @author huey
     * @Description : 单元测试, 参数没用到
     * @Date Created in 2018/9/2 11:11
     */
    @Test
    public void test1() {

        MyExecutor simple = new SimpleExecutor();
        simple.exec("simple");

    }

    @Test
    public void test2() throws IOException, InterruptedException {

        MyExecutor myDefault = new DefaultExecutor();
        myDefault.exec("default");

    }
}

读者须知:

1.本系列文章内容会比较简陋,望有兴趣读者还是fork源码,调试一下。(如果你看过该书,一定可以加深印象)
2.联想下实际运用的哪些业务场景用到该模式,哪些中间件用到该模式,是否自己能在业务中使用。
3.即使你现在用不到某些设计模式,但是还是应该理解其原理的。
4.当时理解并不意味着自己已会,可以自己尝试练习,并幻想一种业务场景,画画类图,设计一下。


coding 时,做到了如何落实;
writing时,做到了如何表达;
sharing时,做到了如何传授;
thinking时,做到了如何提升;

代码请参考码云:https://gitee.com/tjhuey/CodingGroup
设计模式相关概念请参考:http://naotu.baidu.com/file/5811bf42020e6a2d877b992cfca90d26

进度

  • [x] 策略模式,<span style="color: #43A047; ">已完成</span>
  • [x] 观察者模式,<span style="color: #43A047; ">已完成</span>;
  • [x] 装饰者模式,<span style="color: #43A047; ">已完成</span>;
  • [x] 工厂方法模式,<span style="color: #43A047; ">已完成</span>;
  • [x] 抽象工厂模式,<span style="color: #43A047; ">已完成</span>;
  • [x] 单例模式,<span style="color: #43A047; ">已完成</span>;
  • [x] 命令模式,<span style="color: #43A047; ">已完成</span>;
  • [x] 适配模式,<span style="color: #43A047; ">已完成</span>;
  • [x] 外观模式,<span style="color: #43A047; ">已完成</span>;
  • [x] 模板模式,<span style="color: #43A047; ">已完成</span>;
  • [ ] ..,<span style="color: #F44336; ">未完成</span>;

相关文章

网友评论

      本文标题:《读_Head_First_有感》_“模板方法模式”

      本文链接:https://www.haomeiwen.com/subject/iglgwftx.html