java23种设计模式个人整理_java23种设计模式-行为型模式之模板方法模式

cef908281be59aea1699caca8a50eb02.png

定义:

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.
定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

模板方法模式本质:抽象封装流程,具体进行实现

概述:

模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

比如定义一个操作中的算法的骨架,将步骤延迟到子类中。模板方法使得子类能够不去改变一个算法的结构即可重定义算法的某些特定步骤。

模式中的角色

抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。

具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。

优点

模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。

子类实现算法的某些细节,有助于算法的扩展。

通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。

缺点

每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。

使用场景

  • 多个子类有公有的方法,并且逻辑基本相同时;
  • 重要,复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现;
  • 重构时,模板方法模式 是一个经常使用的模式,把相同的代码抽取到父类,然后通过钩子函数约束其行为;
  • 控制子类扩展,子类必须遵守算法规则。

具体实现:

模板方法模式(Template Method)

解释一下模板方法模式,就是指:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用,先看个关系图:

94e421b8133070e589070a5d6fe2a764.png

就是在AbstractCalculator类中定义一个主方法calculate,calculate()调用spilt()等,Plus和Minus分别继承AbstractCalculator类,通过对AbstractCalculator的调用实现对子类的调用,看下面的例子:

抽象类:

70b86f81b5058379aa339252faa43988.png

实现类:

d156f46048eab3eab260b67a1e8616d9.png


测试类:

f8a8914204bbb9711343441ce6b96e77.png

输出:16

我跟踪下这个小程序的执行过程:首先将exp和"+"做参数,调用AbstractCalculator类里的calculate(String,String)方法,在calculate(String,String)里调用同类的split(),之后再调用calculate(int ,int)方法,从这个方法进入到子类中,执行完return num1 + num2后,将值返回到AbstractCalculator类,赋给result,打印出来。正好验证了我们开头的思路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贪心算法之最小堆实现霍夫曼编码

贪心算法之最小堆实现霍夫曼编码 实现之前需要学习的地方: 如果你不了解堆、堆的插入、堆的删除,可以先看下我前面几篇博客 http://blog.csdn.net/u011068702/article/details/52712634 最详细的最小堆构建、插入、删除的过程图解 http://blog.csdn.net/u011068702/artic…

react学习系列之states与props

state React 把组件看成是一个状态机(State Machines)。通过与用户的交互,实现不同状态,然后渲染 UI,让用户界面和数据保持一致。React 里,只需更新组件的 state,然后根据新的 state 重新渲染用…

用VS studio 2008做sql server 报表出现乱码

找了半天,没有发现那里可以修改编码。后面又在网上搜索解决办法,答案少之又少,云里雾里。 后来在csdn上搜索到一片关于水晶报表的乱码解决方案,一试,同样可以解决。 其实并不是编码的问题, 而是因为所选字体不包含中文…

MASA Framework - 整体设计思路

源起年初我们在找一款框架,希望它有如下几个特点:学习成本低只需要学.Net每年主推的技术栈和业务特性必须支持的中间件,给开发同学减负,只需要专注业务就好个人见解:一款好用的框架应该是补充,而不是颠覆或…

​怎么用藏头诗向女友表白......

1 遇到不好使的水龙头时▼2 今天去你家玩好不好(素材来源网络,侵删)▼3 男朋友多会拍照(素材来源网络,侵删)▼4 干饭人有多难▼5 麻将的内涵!(素材来源网络,侵删&…

cvtcolor python opencv_二值分析 | OpenCV + skimage如何提取中心线

点击上方蓝字关注我们微信公众号:OpenCV学堂关注获取更多计算机视觉与深度学习知识问题前几天有个人问了我一个问题,问题是这样的,他有如下的一张二值图像:怎么得到白色Blob中心线,他希望的效果如下:显然Op…

求字符串里里面字符出现的次数和出现哪些不同的字符的字符串

题目: 字符串里里面字符出现的次数和出现哪些不同的字符 such as 字符串“aaaabbbccd” 打印出出现a4次,b3次,c2次,d1次,出现的不同字符的字符串为“abcd”,或者按照规则打印字符串“4a3b2c1d” 代码: #include <stdio.h> #include <stdlib.h> #include &l…

[20140928]创建连接到MySQL的连接服务器

[20140928]创建连接到MySQL的连接服务器 首先要安装 mysql odbc然后 odbc下创建DSN&#xff0c;并且要在系统DSN下。最后执行exec sp_addlinkedserverserver XY,--这是链接服务器的名称srvproduct mysql,--这个你自己随便吧provider MSDASQL,--这是固定的&#xff0c;不能瞎填&…

又砸又烧,还要泼脏水,这谣言到底什么时候才没人信?发生这样的事真没想到.........

全世界只有3.14 % 的人关注了爆炸吧知识曾经看到一条新闻&#xff0c;说的是漂亮国人民怀疑口罩上的那个鼻梁条是5G天线&#xff0c;它不仅能控制人&#xff0c;还能致癌。“所以这就是他们计划杀死我们的方式&#xff0c;他们把5G电线放在了这里&#xff0c;就在这。”一名女子…

如何使用ASP.NET Core Web API实现短链接服务

前言在前面的文章中&#xff0c;我们介绍了hashids.net&#xff0c;可以将数值型Id加密成无意义的字符串。今天&#xff0c;我们来利用这一特点&#xff0c;实现短链接服务。原理短链接&#xff0c;顾名思义就是在形式上比较短的链接网址。借助短链接&#xff0c;可以用简短的网…

[LeetCode]--20. Valid Parentheses

Given a string containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’, determine if the input string is valid. The brackets must close in the correct order, “()” and “()[]{}” are all valid but “(]” and “([)]” are not. public boo…

人生如梦

人生就像一场虚无的梦&#xff0c;可是我已经醒了&#xff0c;我只想过得真实一点

C语言atoi()函数:将字符串转换成int(整数)和sprintf和memset

atoi()函数 #include <stdio.h> #include <stdlib.h>int main () {int i;char buffer[256];printf ("Enter a number: ");fgets (buffer, 256, stdin);i atoi (buffer);printf ("The value entered is %d.", i);system("pause");re…

python 写入excel_一行一行整理EXCEL表太麻烦,试试python脚本,1秒写入数据

最近工作中&#xff0c;要整理数据&#xff0c;本来是以sql脚本录入&#xff0c;但是id、barcode等数据不好整理&#xff0c;因为这几个字段要唯一。所以想到用EXCEL表整理数据&#xff0c;再导入数据库中。整理的过程中&#xff0c;发现EXCEL一行一行的修改也挺麻烦&#xff0…

ORACLE 数据库安装后,PL/SQL的登录问题完美解决

windows7 64位系统 安装完oracle 后的用法如下分享链接&#xff1a;http://www.2cto.com/database/201307/226853.html#comment_iframe安装完PL/SQL后 。当你登陆时。你会遇到各种那个疼的问题。 例如&#xff1a;监听程序在CONNECT_DATA 中未获得SERVICE_NA 无监听程序 无法解…

3、AngularJS2 架构

2019独角兽企业重金招聘Python工程师标准>>> Angular 2 应用程序应用主要由以下 8 个部分组成&#xff1a; 1、模块 (Modules)2、组件 (Components)3、模板 (Templates)4、元数据 (Metadata)5、数据绑定 (Data Binding)6、指令 (Directives)7、服务 (Services)8、依…

Kubernetes:实现应用不停机更新

本篇主要讨论如何实现滚动更新和回滚&#xff0c;任意更换版本并且回滚以前的版本(版本更新)&#xff0c;而下一章会讨论到 Pod 缩放&#xff0c;根据机器资源自动拓展和收缩应用(自动扩容实例)。本文为作者的 Kubernetes 系列电子书的一部分&#xff0c;电子书已经开源&#x…

iOS 7 如何关闭已打开的应用(App)

刚升级了 iOS 7&#xff0c;感觉不太会用了。 在多任务状态下&#xff0c;看着一个个已被打开的应用&#xff0c;不知道如何关闭了。 问了下朋友才知道&#xff0c;在多任务状态下&#xff0c;将对应的应用 向上划 就行。 听说&#xff0c;和 Android 一样的 &#xff1f;&…

除掉字符串里面相同的字符

题目: 除掉字符串里面相同的字符 such as 字符串“aaaabbbccdd” 出去相同的字符就会变成“abcd” 代码: #include <stdio.h> #include <stdlib.h> #include <string.h>void grepString1(char a[]) {int length = strlen(a);int i = 0, j = 0;for (i=0; i…