详细讲解实用的模板方法模式和实例解析

1.简介:

in the book Design Patterns. The template method is a method in a superclass, usually an abstract superclass, and defines the skeleton of an operation in terms of a number of high-level steps. These steps are themselves implemented by additional helper methods in the same class as the template method.( 在《设计模式》一书中。模板方法是超类(通常是抽象超类)中的方法,它根据许多高级步骤定义操作的框架。这些步骤本身由与模板方法相同的类中的其他辅助方法实现。 )

? ——引用自维基百科

? 这里通俗的来讲就是定义一个算法骨架,骨架中有特定方法(一般用final修饰,防止子类修改)和一般方法,一般方法用于给子类实现和扩展。

2.优点和缺点:

优点:

① 封装不变部分,扩展可变部分;

② 提取公共代码,便于维护;

③ 行为由父类控制,子类实现。

缺点:每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。

3.相关实例分析

购物场景:

? 生活中我们都离不开购物,购物我们可能在网上也可能在实体店中购买,但大体可以分为以下几个步骤:浏览商品、加购物车、结算商品价格。这里我们可以把这个总体的步骤当做是一个抽象类,然后我们有这三个步骤,其中具体浏览了什么商品,哪些加购了都可以在子类中实现,最后我们来结算。

? 小明和小花去超市购物,小明想要去买水果,小花去买日用品。于是他们开始挑选相关的产品,最后将加购的商品到收银台结算。

/**
 * 超市总体购物流程
 */
abstract class GoToSuperMarket {

    // 浏览商品
    abstract void BrowseGoods();

    // 加入购物车
    abstract void addToCart();

    // 商品结算
    abstract void settlement();

    public final void shop() {
        BrowseGoods();
        addToCart();
        settlement();
    }
}

/**
 * 小明去超市买水果
 */
class XiaoMing extends GoToSuperMarket {

    @Override
    void BrowseGoods() {
        System.out.println("小明去超市找苹果、橘子、香蕉。。。");
    }

    @Override
    void addToCart() {
        System.out.println("小明挑选了5斤苹果,加入购物车");
    }

    @Override
    void settlement() {
        System.out.println("小明选完了,开始去收银台结算");
    }
}

/**
 * 小花去超市买日用品
 */
class XiaoHua extends GoToSuperMarket {

    @Override
    void BrowseGoods() {
        System.out.println("小花去超市找毛巾、毯子、牙刷。。。");
    }

    @Override
    void addToCart() {
        System.out.println("小花挑选了毛巾和牙刷,加入购物车");
    }

    @Override
    void settlement() {
        System.out.println("小花选完了,开始去收银台结算");
    }
}

public class process {

    public static void main(String[] args) {
        GoToSuperMarket shopperOne = new XiaoMing();
        shopperOne.shop();
        System.out.println();
        GoToSuperMarket shopperTwo = new XiaoHua();
        shopperTwo.shop();
    }
}
输出结果:
小明去超市找苹果、橘子、香蕉。。。
小明挑选了5斤苹果,加入购物车
小明选完了,开始去收银台结算

小花去超市找毛巾、毯子、牙刷。。。
小花挑选了毛巾和牙刷,加入购物车
小花选完了,开始去收银台结算

4.总结

在日常开发中,我们不妨把公共重复利用的代码抽取出来,这样既能显得简洁而又具有逻辑性。同时我们又可以扩展其它方法,使得类具有更多的功能。

原文地址:https://www.cnblogs.com/charlypage/p/11828195.html

时间: 2024-10-08 02:59:31

详细讲解实用的模板方法模式和实例解析的相关文章

详细讲解多个华为交换机配置实例

详细讲解多个华为交换机配置实例 交换机的配置是网络管理员的基本技能,本文以华为S5700交换机为例,结合使用sNSP模拟器,详细阐述VLAN配置.VLAN之间通信.跨交换机VLAN配置.跨交换机VLAN之间通信等.(备注:以下配置的都是基于交换机接口的VLAN) 一.单台交换机下VLAN配置 1.配置单个VLAN 华为S5700本身默认有个VLAN,若不另行配置,直接接入交换机的终端都属于默认的VLAN,其编号是1.若要手动配置一个指定编号为10的VLAN,可用eNSP创建如下拓扑. 其中LSW

设计模式课程 设计模式精讲 17-3 模板方法模式源码解析

1 源码解析 1.1 源码解析1(在jdk中的使用) 1.2 源码解析2(在servlet中的应用) 1.3 源码解析3(在mybaties中的应用) 1 源码解析 1.1 源码解析1(在jdk中的使用) AbstractList(父类) public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { //get方法为抽象方法,完全交给子类去实现 abstr

14.设计模式_模板方法模式

一.引言 提到模板,大家肯定不免想到生活中的"简历模板"."论文模板"."Word中模版文件"等,在现实生活中,模板的概念就是--有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载下来简历模板之后我们可以根据自己的情况填充不同的内容要完成属于自己的简历.在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概

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

一.引言 提到模板,大家肯定不免想到生活中的"简历模板"."论文模板"."Word中模版文件"等,在现实生活中,模板的概念就是--有一个规定的格式,然后每个人都可以根据自己的需求或情况去更新它,例如简历模板,下载下来的简历模板的格式都是相同的,然而我们下载下来简历模板之后我们可以根据自己的情况填充不同的内容要完成属于自己的简历.在设计模式中,模板方法模式中模板和生活中模板概念非常类似,下面让我们就详细介绍模板方法的定义,大家可以根据生活中模板的概

jqm的多列布局demo,html5的多列布局demo,多列布局的详细讲解,html5开发实例详解

由于移动设备屏幕宽度较小,所以一般不建议使用多列布局.但有时你可能需要并排放置一些元素(如按钮之类的). jQuery Mobile通过约定的类名ui-grid来提供了一种基于css的多列布局方法.共提供了五种布局方式,分别是:ui-gird-solo:单列布局,ui-gird-a:双列布局,ui-gird-b:三列布局,ui-gird-c:四列布局,ui-gird-d:五列布局.布局网格总宽度100%,完全不可见(无边框无背景),没有任何内边距或外边距,不会对网格中的内容产生任何干扰. 今天我

详细讲解提高数据库查询效率的实用方法、外键关于性能

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放

JS正则表达式大全(整理详细且实用)

JS正则表达式大全(整理详细且实用).需要的朋友可以过来参考下,希望对大家有所帮助!! 正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界. -或- 对正则表达式功能字符的还原,如"*"匹配它前面元字符0次或多次,/a*/将匹配a,aa,aaa,加了"\"后,/a\*/将只匹配"a*".

【大话设计模式】—— 模板方法模式

一.概念 上一篇文章刚刚讲了[大话设计模式]-- 原型模式,原型模式主要是通过Clone()方法,创建新的对象,免去了初始化的过程.模板方法模式也特别会"偷工减料",把不变的行为搬移到超类,去除子类中的重复代码,将代码的复用优势展现的淋漓尽致.它为我们提供了特定的结构和样式,我们只需关心填充数据内容就好,省心啊- 下面让我们来看一下它的准确定义: 模板方法(TemplateMethod)模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构

Android自定义相机超详细讲解

Android自定义相机超详细讲解 转载请标明出处: http://blog.csdn.net/vinicolor/article/details/49642861: 由于网上关于Android自定义相机的文章写得不是太详细,Google官方的文档又说得不太容易理解,所以今天我来详细讲解一下Android自定义相机. 这篇文章主要写给一些刚刚接触Android的那些看官方API困难以及不太了解Android机制的同学们,所以熟练开发者可以绕道了. 最近在使用Camera类的时候发现居然被弃用了,