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

原创 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)。

相关文章推荐

学习设计模式:简单工厂、模板方法、单例(上)

既然是学习设计模式,就得搭建一个测试各种模式的平台,对于每一个模式去创建一个工程,略显麻烦,把模式分隔开来学习也是不应该的,通过把对每个模式的测试代码集合到一个平台上,可以让学习者更好地理解《设计模式...

学习设计模式:简单工厂、模板方法、单例(下)

接上篇, 本文将记录去除简单工厂里的switch语句的方法与单例模式的使用,先说如何去除switch语句。     比较简单的实现是在每次程序开始运行为每一个类实例化一个PatternTester子...

Java设计模式学习笔记之 —— 模板方法(Template Method)

跟随郭霖大神的脚步学习设计模式,真是通俗易懂~赞: 原文出处:http://blog.csdn.net/guolin_blog/article/details/8744002模板方法: 定义一个操...

跟着实例学习设计模式(3)-工厂方法(创建型)

工厂方法属于创建型设计模式。 设计意图:定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。        静态工厂使用面向对象的方式,有效的解决了增加新产品...
  • andy_gx
  • andy_gx
  • 2015年07月10日 12:16
  • 549

设计模式实例学习-工厂方法

设计模式实例学习-工厂方法定义概念定义(对象创建型模式) 定义一个用于创建对象的接口,让子类决定实例化那个类。工程方法使一个类的实例化延迟到其子类。 角色职责 抽象产品类 具体产品类 抽象工厂类...

Head First设计模式学习—模板方法、策略模式

参考资料: 1. head first 设计模式 2. http://blog.csdn.net/hguisu/article/details/7558249/ 在看...
  • zlp1992
  • zlp1992
  • 2016年08月02日 14:44
  • 394

java设计模式学习之模板方法模式

一、概述类似于生活中很多事情都是有固定的流程和步骤,比如冲泡咖啡和泡茶它们都要经过如下步骤: 冲泡咖啡: 将水煮沸 用沸水冲泡咖啡 将饮料倒入杯中 添加糖和牛奶 泡茶 将水煮沸 用热水浸泡茶叶 将饮...

《 Head first设计模式 》学习笔记 – 模板方法模式

模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 有些人没有咖啡就活不下去;有些人则离...

模板方法模式(学习于 php设计模式 书 )

什么是模板方法模式 这个方法的作用是对抽象方法序列排序,具体实现留给具体类来完成 关键在于模板方法模式定义了操作中算法的“骨架”,而由具体类来实现 何时使用模板方法 如果已经明确算法中的一些步骤,不过...
  • ytawu
  • ytawu
  • 2016年07月04日 23:13
  • 165

Head First设计模式学习笔记-------(9)模板方法模式

今天我们讲的模式,在平时运用过程中十分常见,那这个模式是什么呢,那就是模板方法模式。 让我们先来看一个简单的例子吧。 是不是感觉咖啡冲泡和茶冲泡的过程非常相似,如果设计这两个类,是不是也大...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式实例学习-模板方法
举报原因:
原因补充:

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