zoukankan      html  css  js  c++  java
  • 模版方法设计模式

    什么模板方法

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

    重复代码全部在父类里面,不同业务的,抽取给子类进行实现。抽取过程---抽象方法。

    某些特定步骤。

    核心:处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,我们采用工厂方法模式,将这个节点的代码实现转移给

    子类完成。即:处理步骤在父类中定义好,具体的实现延迟到子类中定义。

    说白了,就是将一些相同操作的代码,封装成一个算法的骨架。核心的部分留在子类中操作,在父类中只把那些骨架做好。

    例如:

    1.去银行办业务,银行给我们提供了一个模板就是:先取号,排对,办理业务(核心部分我们子类完成),给客服人员评分,完毕。

     这里办理业务是属于子类来完成的,其他的取号,排队,评分则是一个模板。

    2.去餐厅吃饭,餐厅给提供的一套模板就是:先点餐,等待,吃饭(核心部分我们子类完成),买单。

    这里吃饭是属于子类来完成的,其他的点餐,买单则是餐厅提供给我们客户的一个模板。

    什么时候使用模板方法

    实现一些操作时,整体步骤很固定,但是呢。就是其中一小部分容易变,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。

    开发中应用场景

     其实,各个框架中,都有模板方法模式的影子。

    数据库访问的封装、Junit单元测试、servlet中关于doGet/doPost方法的调用

    Hibernate中模板程序、spring中JDBCTemplate,HibernateTemplate等等

    代码例子:

    package com.example.demo.templatefactory;

    /**
    * 模版方法接口
    * 场景:第三方短信接口服务方调用联通运行商、移动运营商 实现的场景
    * 1.开始 记录开始日志
    * 2.调用 接口进行代码逻辑处理(不同运行商逻辑处理可能不同)
    * 3.返回结果 记录结束日志
    *
    * 从上面这几个步骤来看,第一步与第三步的操作都是一样的。只有第二步需要做单独的处理。
    * 因为开始记录日志、结束记录日志做的都是统一处理,只有业务逻辑处理单独的方法进行处理(抽象类)。
    */
    public abstract class MessageTemplate {

    public void sendMsg() {
    //1. 记录开始日志
    addStartLog();

    //2.调用具体的运营商发送消息
    httpRequest();

    //3.结束结束日志
    addEndLog();
    }


    /**
    * 不同的运营商 请求出来可能不同
    */
    public abstract void httpRequest();

    /**
    * 调用方法开始时记录日志操作
    */
    private void addStartLog() {

    System.out.println("调用运行商开始时记录日志");
    }


    /**
    * 调用方法结束时记录日志
    */
    private void addEndLog() {
    System.out.println("调用运行商结束时记录日志");
    }

    }

    package com.example.demo.templatefactory;

    /**
    * 接口实现类
    */
    public class Liantong extends MessageTemplate {
    @Override
    public void httpRequest() {
    System.out.println("调用联通接口逻辑处理执行...");
    }
    }

    package com.example.demo.templatefactory;
    /**
    * 接口实现类
    */
    public class YiDong extends MessageTemplate {
    @Override
    public void httpRequest() {
    System.out.println("调用移动接口逻辑处理执行...");
    }
    }

    package com.example.demo.templatefactory;

    /**
    * 客户端调用
    */
    public class ClientTemplate {
    public static void main(String[] args) {
    //初始化
    MessageTemplate yiDong = new YiDong();
    //调用方法执行
    yiDong.sendMsg();
    }
    }
  • 相关阅读:
    后台跨域(CORS)
    golang 处理TCP粘包问题
    使用axios 发送ajax 下载文件
    Golang:在Redigo的RedisPool上选择DB
    puppeteer添加代理
    mongodb 权限操作
    alpine下安装icu-dev
    golang 导出CSV文件中文乱码的问题
    shell笔记
    Convert rune to int
  • 原文地址:https://www.cnblogs.com/ming-blogs/p/10841736.html
Copyright © 2011-2022 走看看