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();
    }
    }
  • 相关阅读:
    iOS最笨的办法实现无限轮播图(网络加载)
    iOS 动画基础总结篇
    ios 深入讲解iOS键盘一:控制键盘隐藏显示
    iOS开发之提交App中断出现:Cannot proceed with delivery: an existing transporter instance is currently uploading this package
    ios -仿微信有多级网页时,显示返回跟关闭按钮
    IOS启动页动画(uiview 淡入淡出效果 )2
    数量加减
    Swift泛型协议的N种用法
    一个swift版简单的用户名和密码输入textField
    Mac电脑上怎么设置环境变量
  • 原文地址:https://www.cnblogs.com/ming-blogs/p/10841736.html
Copyright © 2011-2022 走看看