"那个,上次由于我老婆要给我做饭,所以就没有说完就走掉了、、、这个那个"。这次和以前一样,先来开场福利(工厂方法模式已被作者踹下场)。由美女抽象工厂介绍一下适用场景~大家欢迎

抽象工厂之应用场景

  • 一个系统要独立于它的产品的创建、组合和表示时。
  • 一个系统要由多个产品系列中的一个来配置时。
  • 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
  • 当你提供一个产品类库,而只想显示它们的接口而不是实现时。

  “人家要讲的就这么多了,接下来还是让今天的主角-诗人模板方法哥哥了。”

  “天苍苍,野茫茫,风吹雾霾见工厂~你看你夫妻俩生产那么多的吃的,把空气都污染的不行了,雾霾越来越大了。”“还不是因为作者鱼哥这个吃货”(抽象工厂碎碎念。“阿嚏,谁又想我了”。某作者说完又拿起辣条吃了起来、、、),接下来,我先来个自我介绍吧。

模板方法之自我介绍

  其实大家经常就用到我,只是不知道我叫什么罢了。对于我的定义如下:

  Define the skeleton of an algorithm in an operation, deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.听抽象妹纸说你们不太懂中文,那我就给翻译下:定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

  我的通用类图如下所示:

  

  其中Abstract类是抽象类,其实也就是一抽象模板,定义并实现了一个模板方法。这个模板方法一般是一个具体的方法,它给出了一个顶级的逻辑骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现。

  ConcreteClass实现父类所定义的一个或者多个抽象方法,每一个AbstractClass都可以有任意多个ConcreteClass与之对应,而每一个ConcreteClass都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。好了,基本情况就是这样的了。

模板方法之自我分析

  金无足赤,人无完人~先说不足乃我一大爱好:

  • 一般情况下都喜欢在抽象类声明最抽象最一般的事物属性方法,实现类实现具体事物的属性和方法,我却反其道而行之,因此在在复杂的项目中会对代码的阅读造成一定的影响。

  优点:

  • 封装不变的部分,扩展可变的部分。
  • 提取了公共代码,便于维护。
  • 行为由父类控制,子类实现。

  俗话说:Talk is cheap,show me the code。所以接下来我就实现一个简单的模板方法模式来加深一下尔等的理解。

模板方法之具体实现

  既然要实现,那就来个简单的栗子,想必你们都知道世上有两种生物,一种的具体活动就是“吃饭,睡觉,打豆豆。”(作者按:豆豆躺枪。)还有一种就是“吃饭,睡觉,敲代码。”(程序猿躺枪。)这个很简单,只需要一个动物的模型,也可能是其它物种,此处定义为动物。为了清楚认识我,先来个不是由模板方法实现的代码。首先来实现一下动物的代码: 

 1 public abstract class Animal{
2 //生物都需要吃东西
3 public abstract void eat();
4 //生物也都要睡觉
5 public abstract void sleep();
6 //其他活动
7 public abstract void otherthing();
8 //日常活动
9 public abstract void activities();
10 }

  每种动物都要有吃东西、睡觉、娱乐活动、然后是一天的总结。但是每个物种的具体实现又不同,下面先给出“吃饭睡觉打豆豆”的具体实现。

 1 public class AnimalY1 extends Animal{
2
3 public void eat(){
4 System.out.println("Y1动物吃糖葫芦和辣条"); //想到作者的都是出现幻觉的。
5 }
6 public void sleep(){
7 System.out.println("Y1动物睡在绳子上"); //想到小笼包的罚你在墙角面壁思过。
8 }
9 public void otherthing(){
10 System.out.println("打豆豆");
11 }
12
13 public void activities(){
14
15 this.eat();
16 this.otherthing();
17 this.sleep();
18
19 }
20 }

  接下来就是第二个生物,程序猿的具体实现: 

 1 public class AnimalY2 extends Animal{
2
3 public void eat(){
4 System.out.println("吃外卖"); //好心酸有木有
5 }
6 public void sleep(){
7 System.out.println("睡在工位上"); //已泪目
8 }
9 public void otherthing(){
10 System.out.println("敲代码");
11 }
12
13 public void activities(){
14
15 this.eat();
16 this.otherthing();
17 this.sleep();
18
19 }
20 }

  发现什么没有?没有?再仔细看看,是不是有一个activities每日总结都一样?对了,这个是共有的,自然要出现在抽象类中,尔等要记住一个原则:DRY。What,吾辈说错了?尔等说记得明明是DIY?可笑之极,Don't take it for granted。吾辈的意思是:Don't repeat yourself。如若在代码中发现多次重复,那么就需要想一想你的设计是不是有问题,如果不能说明原因,那就重构吧。下面我们做下修改,用上模板模式来做,首先修改一下抽象类:

 1 public abstract class Animal{
2 //生物都需要吃东西
3 public abstract void eat();
4 //生物也都要睡觉
5 public abstract void sleep();
6 //其他活动
7 public abstract void otherthing();
8 //日常活动
9 public void activities(){
10 this.eat();
11 this.otherthing();
12 this.sleep();
13 }
14 }

  在抽象的模板方法中定义了之后,把实现类的activies方法就可以移除了具体就不说了。测试类还需要否?那么简单的就不来了吧、、、好了,就到这里了

  “仰天大笑出门去,我辈岂是蓬蒿人~”。“客官请留步,啊呸,模板请留步,你还没讲场景~~”。只见模板一个燕返便回来了。作者已愣住(作者碎碎念:传说中佐佐木小次郎的燕返竟然让他用于身法,这也太、、、)

模板方法之使用场景

  • 一次性实现一个算法的不变的部分,并将可变部分留给子类实现。
  • 控制子类扩展。
  • 各子类中公共行为可以被提取出来放到一个公共父类中。

  (作者抹了抹头上的冷汗,往嘴里扔进一颗巧克力,道:还好这次没再出什么岔子~吃个巧克力压压惊),好了模板方法到此就讲完了,欲知下次讲什么?且听下回分解。

设计模式之模板方法模式(Java实现)的更多相关文章

  1. 软件设计模式之模板方法模式(JAVA)

    什么是模板方法模式? 定义一个操作中算法的骨架,而将这些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤. 好抽象的概念啊,文绉绉的东西就是不讨人喜欢,下面我 ...

  2. 折腾Java设计模式之模板方法模式

    博客原文地址:折腾Java设计模式之模板方法模式 模板方法模式 Define the skeleton of an algorithm in an operation, deferring some ...

  3. 设计模式之第3章-模板方法模式(Java实现)

    设计模式之第3章-模板方法模式(Java实现) "那个,上次由于我老婆要给我做饭,所以就没有说完就走掉了...这个那个".这次和以前一样,先来开场福利(工厂方法模式已被作者踹下场) ...

  4. 乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern)

    原文:乐在其中设计模式(C#) - 模板方法模式(Template Method Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 模板方法模式(Template Method ...

  5. js设计模式——6.模板方法模式与职责链模式

    js设计模式——6.模板方法模式与职责链模式 职责链模式

  6. Java设计模式应用——模板方法模式

    所谓模板方法模式,就是在一组方法结构一致,只有部分逻辑不一样时,使用抽象类制作一个逻辑模板,具体是实现类仅仅实现特殊逻辑就行了.类似科举制度八股文,文章结构相同,仅仅具体语句有差异,我们只需要按照八股 ...

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

    前言: 我们在开发中有很多固定的流程,这些流程有很多步凑是固定的,比如JDBC中获取连接,关闭连接这些流程是固定不变的,变动的只有设置参数,解析结果集这些是根据不同的实体对象“来做调整”,针对这种拥有 ...

  8. java设计模式之模板方法模式

    模板方法模式 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差 ...

  9. Java中类的继承,属性和方法的四种修饰符的作用范围,final关键字,java的三大特点中的2个:封装和多态,以及多态的一个设计模式,模板方法模式(template method)

    (一)Java中的继承: 关于继承,在Java中类的继承只能是单继承,不像C+++那样灵活,可以多继承,多继承的后果就是各种关系乱套,就相当于一个孩子有2个母亲一样,社会关系的复杂,不利于程序后期的开 ...

随机推荐

  1. drop有default constraint的column

    有时候我们在drop column的时候,会遇到一些default constraints而不能drop,如果我们已经知道constraint name,则可以用下面的语句先把constraint r ...

  2. Nginx动静分离知识及配置

    Nginx动静分离知识及配置,本质上与分离上传下载功能是相同功能,本质就是在文件服务器也是需要部署WEB应用的,只是在进行代理分离的时候分配到对应的文件服务器上去. 随着Nginx高性能Web服务器大 ...

  3. DataGridView使用技巧四:删除行操作

    一.无条件的删除行 默认时,DataGridView是允许用户进行行的删除操作,选中要删除的行,按Delete键可以删除,该操作没有任何提示(只是删除界面显示的数据,不会真实删除数据库中的数据).如果 ...

  4. 用isNaN函数来判断是否只能输入正负数字

    isNaN() 函数通常用于检测 parseFloat() 和 parseInt() 的结果, 以判断它们表示的是否是合法的数字.当然也可以用 isNaN() 函数来检测算数错误,比如用 0 作除数的 ...

  5. C++隐式转换与显式转换

    普通类型的转换顺序:隐式把char——>int和从short——>double.转换可能会导致数据的丢失. 自定义类型:有两种函数可以进行隐式转换,单参数构造函数 和 隐式类型转换符.   ...

  6. 【转】C#调用WebService实例和开发

    一.基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是 ...

  7. imx6dl uboot 移植

    新版的BSP引进的设备树的机制,在uboot中还添加了menuconfig的配置菜单. 参考官网的文档进行uboot移植,本文使用的cpu是imx6dl,uboot版本2015.04. 我要添加一个名 ...

  8. 一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) set 注入

    一:这里先说一下DI(Dependency Injection)依赖注入有种表现形式:一种是CI(Constructor Injection)构造方法注入,另一种是SI(Set Injection) ...

  9. ef中用lambda expressions时要注意(m=>m.id ==b ) 此时的b只能是基本的数据类型 。连属性都不能用

    ef中用lambda expressions时要注意(m=>m.id ==b ) 此时的b只能是基本的数据类型 .连属性都不能用

  10. PHP 5种方式获取文件后缀名

    <?php header("content-type:text/html;charset=utf-8"); function get_ext1($filename) { re ...