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

来源:互联网 发布:人工智能出现表明 编辑:程序博客网 时间:2024/06/10 20:30

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

原创博客,转载请注明出处:
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)。

1 0
原创粉丝点击