设计模式实例学习-模板方法

原创 2015年11月20日 23:53:25

设计模式实例学习-模板方法

原创博客,转载请注明出处:
http://blog.csdn.net/u011035622/article/details/49954803


定义

概念定义

    定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
    我的理解,先举个最简单例子,我们打开门的时候走的流程是这样的:解锁->开门。这里解锁和开门就是算法的框架,每个打开门的流程都是这样的,但具体如何解锁及如何开门则是子类负责的,比如解锁可能是密码解锁、钥匙解锁、指纹解锁等等,而开门可能是推开门、拉卡门、向上拉门等等。通过已知的模板流程,在不同子类去定义实现不同的具体细节方法。

角色职能

  • 抽象模板类

    像定义描述的那样,定义一个算法的模板,里面的一些方法交由子类具体实现。
    
  • 具体模板类

    实现模板中的具体细节方法。
    

实例分析

场景描述

    老板打算简单实现一个网上购物的第三方软件,根据公众的认可度,买电子商品一般我会上京东,买书的话一般会上当当。支付的话,微信有时会有京东的优惠卷,所以在京东用微信支付,当当网就用支付宝付款。根据这个情况完成老板给的需求。

代码实现及讲解

  • 抽象模板类
      ShoppingOnline.java
//网上购物-抽象模板类
public abstract class ShoppingOnline {
    //上指定的网站
    public abstract void getWebsite();
    //订购需要的商品
    public abstract void getTheNeed();
    //网上付钱
    public abstract void pay();

    //购物流程模板
    public void shoppingProcedure(){
        this.getWebsite();
        this.getTheNeed();
        this.pay();
    }
}
  • 具体模板类
      BuyBooks.java:具体实现模板方法中的具体细节。
      BuyComputers.java:具体实现模板方法中的具体细节。
     
//网上买书
public class BuyBooks extends ShoppingOnline{

    @Override
    public void getWebsite() {
        System.out.println("当当网");
    }

    @Override
    public void getTheNeed() {
        System.out.println("Java编程思想、java虚拟机...");
    }

    @Override
    public void pay() {
        System.out.println("支付宝付款");
    }

}
//买电脑产品
public class BuyComputers extends ShoppingOnline{

    @Override
    public void getWebsite() {
        System.out.println("京东商城");
    }

    @Override
    public void getTheNeed() {
        System.out.println("联想笔记本、机械键盘...");
    }

    @Override
    public void pay() {
        System.out.println("微信支付");
    }

}
  • 场景类
public class Main {
    public static void main(String[] args) {
        ShoppingOnline buyBooks = new BuyBooks();
        ShoppingOnline buyCompu = new BuyComputers();
        buyBooks.shoppingProcedure();
        System.out.println("--------------------");
        buyCompu.shoppingProcedure();
    }
}

输出:

当当网
Java编程思想、java虚拟机...
支付宝付款
--------------------
京东商城
联想笔记本、机械键盘...
微信支付
    这样看过去大部分人都觉得DEMO很简答,而且自己以前也经常有这样写过这样类似的东西,但事实上者这就是模板方法。父类中定义了算法框架流程,子类实现区别性的细节部分。

模板方法的优缺点

优点

  • 提取出了公共部分的代码,便于维护。
  • 在抽象类中对算法流程进行封装,在子类中实现及拓展。

缺点

  • 子类中实现具体方法细节,子类的执行结果影响父类,代码可读性降低。(事实上我觉得这样不太算缺点,相比于优点,这个缺点可以忽略不计吧。)

使用场景

  • 框架流程相同时(多个子类拥有共同的方法)
  • 核心、复杂的方法设计为模板方法,子功能由子类去实现。
  • 重构时常常将相同的代码抽取到父类中常常用到模板方法,通过钩子函数约束行为(isXXX、setXXX)。

模板方法模式例子

原文地址:http://www.cnblogs.com/jenkinschan/p/5768760.html一、概述 模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得...
  • disiwei1012
  • disiwei1012
  • 2016年12月05日 17:14
  • 846

Spring整合JDBC模板方法设计模式之基于组合的实现

Spring整合JDBC模板方法设计模式之基于组合的实现: 模板设计模式指的是将相应的模板方法提取出来在一个专门的一个位置定义,然后把相同调用过程的操作通过模板实现。 对于模板设计模式,一般有2中方式...
  • rzg813
  • rzg813
  • 2014年09月23日 01:03
  • 3093

JavaScript设计模式--模板方法模式

一、定义模板方法是基于继承的设计模式,可以很好的提高系统的扩展性。 java中的抽象父类、子类 模板方法有两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。二、示例Coffee or T...
  • ligang2585116
  • ligang2585116
  • 2015年12月20日 19:29
  • 1422

设计模式系列之四_策略模式 和 模版方法模式(Template method)

1.策略模式 1.1 策略模式   策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。 策略模式让算法独立于使用它的客户而独立变化。   策略模式属于对象的行为模式...
  • orclight
  • orclight
  • 2013年03月12日 16:28
  • 3591

Java设计模式之模板方法模式(Template Method)

本文属于23种设计模式系列,介绍的是模板方法模式。
  • jason0539
  • jason0539
  • 2015年04月15日 08:37
  • 27098

设计模式——Spring IoC中用到的模板方法模式

http://www.cnblogs.com/gnidoc/p/4981447.html 基本概念 什么是模板方法(Template method):父类定义了骨架(调用哪些方法及顺序...
  • z69183787
  • z69183787
  • 2017年03月24日 10:55
  • 1421

设计模式之模板方法模式和策略模式

转载请标明出处:http://blog.csdn.net/shensky711/article/details/53418034 本文出自: 【HansChen的博客】 设计模式系列文章: 设...
  • shensky711
  • shensky711
  • 2016年12月01日 08:50
  • 1384

C++设计模式——模板方法(Template Method)

模板方法(template method)设计模式用于定义一个包含许多步骤的算法框架,允许子类重写(覆盖)算法的某一个步骤而不改变算法整体的流程和框架。例如一个算法(如聚类算法)可能包含初始化(ini...
  • lanchunhui
  • lanchunhui
  • 2016年03月17日 16:02
  • 612

设计模式之禅——模板方法模式&钩子方法

**模**板方法模式的定义:定义一个操作的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的框架即可重定义该算法的某些特定步骤。例子:做一个简单的悍马车的模型见UML图 一个抽象悍马...
  • TyroneRenekton
  • TyroneRenekton
  • 2016年08月21日 12:15
  • 4428

设计模式 模版方法模式 展现程序员的一天

继续设计模式~ 模版方法模式 老套路,先看下定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。 简单看下定义,模版方法定义了一个算...
  • lmj623565791
  • lmj623565791
  • 2014年05月19日 19:33
  • 13787
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式实例学习-模板方法
举报原因:
原因补充:

(最多只允许输入30个字)