虽然最近项目比较紧,但是仍坚持每天看几页Head First Design Pattern(short for HFDP),可以说是受益良多,刚刚看过Template Pattern,其中有一个特殊的环节就是FireSide Chat(HFDP的特色,没有新的Pattern讲述完毕,就会拿出类似的Patterns做对话,相当的不错)。这一次是Template vs Strategy compare methods。而factory 也和template也有很大相似的地方
先分别说:
一、Template method Patten -- Encapsulating Algorithms
这是我们最为熟悉和常用的一个设计模式,特别是用于框架的构建中,Template可谓功不可没,最为鲜明的例子:Struts。Template Method Pattern defines the skeleton of an algorithm in a method,deferring some steps to subclasses.Template method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
一出现了Struts字样,就会发现Template method 一下就亲切了不少(其实这样说并不准确,实际上是Servlet实现了这一模式,而Struts的ActionServlet就是一个标准的Servlet实现),这样在我们平时的工作过程中,Template一下变得无处不在,不管什么项目,只要上点规模,肯定是要写个基础算法的基类,要不不行就上框架,OK,你已经在使用Template method pattern了,还有HFDP中还告诉我们java.io的read()方法 Array的sort() JFrame Applet都活跃着Template的影子,也就是说有一个固定的算法、一些可复用的方法这就构成了一个Template。Template是实现了经典好莱坞原则Don't call me,i'll call you的最佳范例,在好莱坞原则下,允许low-level component将自己hook到一个系统中,并且有High-level component决定他们什么时候被使用和怎样被使用。
二、Strategy method pattern
做为HFDP的开篇模式,Strategy的任务似乎更多一些,不但要让读者更为清晰的认识到使用模式的作用和必要性,还要介绍若干基本问题,而其通过几只不同的鸭子来阐述这一模式读者来说显得更生动而印象深刻。
所以在认识Strategy的过程中我们首先认识的是3个OO design Principle
1.Identify the aspects of your application that vary and separate them from what stays the same 鸭子是会变的,它们今天会叫、明天可能就会飞,它们会变成怎样我们不知道,但是我们有了这个设计原则就你要变就分开变,怎么变我们也不怕不怕。
2.Program to an interface, not an implementation 最典型的就是Java的上溯造型了,看Think in Java最先学到的就是这个。
3.Favor composition over inheritance 看来这第一章的信息量真的是大哦,composition,这里就引出了一个OO的两个基础模式composition和aggregation,于是去google,发现了这个:http://www.visualcase.com/kbase/associations.htm,重新理解下assosiation,compostion,aggregation之间的关系和区别。下面介绍了这些东西,猛然发现现在写文字也有职业病的困扰,这种介绍方式很像一个内部类的实现 :(。明白了composition,这个原则就很清晰,慎用继承而使用composition。3个原则加在一起,Strategy的雏形也就差不多了:Strategy模式将可能会变化的部分封装起来与其他对象分离,并使用接口来调用他们而不去关心具体实现,这个过程都不是继承而来而是组合了所有接口。
assosiation表明对象和对象之间有关系,学生去学校读书、学生选择课程,学生和学校、课程之间就有了关系。每个对象被称为roles,每个roles都由name、multiplicity、navigability、type几个属性构成
Multiplicity:指定roles之间有多少对象可以参与到这个relationship中来,学校有多个学生,而学生只有一个学校。
Navigability:每个roles都有arrow(在UML关系图中)指定他们的Navigability,展示classes在关联关系中维护关系的职责,可以通过学校知道有什么学生在学校读书,也就是defined by the navigability of the assosiation。
type:可以有三种:assosiation,composition,aggregation,
A.assosiation就是上面说到的关系
B.composition 指明对象的从属关系,多边形包括多个点,多边形不在了,点也不复存在。
C.aggregation 和composition类似,也表示对象的从属关系,但是没有composition那么严格,订单是包含多个产品,但是订单不存在产品却仍然存在。
经历了3个设计原则的介绍,才把这个Strategy引出来,足见Strategy有多牛:The Strategy Method Pattern defines a family of algorithms,encasulates each one,and makes them interchageable.Strategy lets the algorithm vary independently from clients that use it.
最常见的例子:Spring的DI,在使用一个Spring的Bean的时候就是先来个composition+setter method。
三、Factory
已经在我的上一篇读书笔记中提到很多了,所以这里就不详细说,Factory就是定义了对象构建的超类。但是和本文有关的是Abstract Factory,它不但构建了对象,还在构建的同时定义了一些固定的算法。
比较:Template、Stategy、Factory
狂多的东西都需要比较着来看,刚是合成、聚合和关联比较,现在是它们3个,真的很乱,特别是Factory还经常和Template混用,但是还是有些差别,Template比较单纯,仅仅是定义了算法的过程,而且是单纯的继承,Abstract Factory是指定了一定的算法去构建对象。
Template和Strategy,个人认为,他们的比较就可以想Struts1和Struts2(webwork2)比较一样,一个使用了继承,一个使用了接口,这样对Template可能不公平,因为Struts令人诟病很深的就是这个继承,但是它仍然那么有生命力,Struts的ActionServlet定义了一个完成doget()请求的处理方式,也就是这个处理方式算法的骨架,然后由我们去实现具体的不同的业务逻辑,并且Template模式中子类是可以任意使用父类中的公共方法的,减少了代码重复。而WebWork的execution就是那么一个接口,如何实现你说了算,也就是那个封装和分离可能会变化的东西的原则,Webwork允许使用它的客户端来决定算法的变化。
分享到:
相关推荐
Servlet生命周期包括初始化、服务和销毁三个阶段,可以通过重写doGet和doPost方法来响应HTTP GET和POST请求。 JSP(JavaServer Pages)是Java EE中的视图技术,用于生成动态HTML、XML或其他格式的文档。JSP页面可以...
之前安装测试fake包时,pip各种安装fake失败,后来找到的这个包,说是fake之前叫fake-fatory,亲测可用
在系统Verilog的验证环境中,UVM(Universal Verification Methodology)是一个广泛应用的验证框架,它提供了许多高级功能,包括工厂(Factory)机制。这个工厂机制是UVM的核心部分,用于动态地创建和配置验证组件。...
Jupyter-Notebook
考研公共课历年真题集-最新发布.zip
2006-2023年上市公司资产误定价Misp数据集(4.9万样本,含原始数据、代码及结果,最新).zip
Jupyter-Notebook
Jupyter-Notebook
100个Origin软件高效使用技巧大全-最新更新.zip
Jupyter-Notebook
煤矿感知数据联网接入规范 第2部分:重要设备
1、资源内容地址:https://blog.csdn.net/abc6838/article/details/143777985 2、数据特点:今年全新,手工精心整理,放心引用,数据来自权威,且标注《数据来源》,相对于其他人的控制变量数据准确很多,适合写论文做实证用 ,不会出现数据造假问题 3、适用对象:大学生,本科生,研究生小白可用,容易上手!!! 4、课程引用: 经济学,地理学,城市规划与城市研究,公共政策与管理,社会学,商业与管理
KSSJ_CJ15-2023
全国电子地图行政区划道路水系数据-最新shp.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
全国乡镇级行政区划矢量数据2.0版-最新.zip
Jupyter-Notebook
Typora(version 1.2.3)导出 pdf 自定义水印的 frame.js 文件,详情可以查看:
【作品名称】:基于Java 实现的电脑鼠走迷宫的软件程序 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 迷宫地图生成算法的设计和实现 自动生成迷宫:根据迷宫生成算法自动生成一定复杂度的迷宫地图。 手动生成迷宫:根据文件中存储的固定数据生成迷宫地图。 单路径寻找算法的设计与实现:找出迷宫中一条单一的通路。 迷宫遍历算法的设计与实现:遍历迷宫中所有的可行路径。 最短路径计算算法的设计与实现:根据遍历结果,找出迷宫中所有通路中的最短通路。 (3)第二部分:界面展示部分 生成迷宫地图界面的设计与实现:根据生成的迷宫地图,用可视化的界面展现出来。 界面布局的设计与实现:根据迷宫程序的总体需求,设计和实现合理的界面布局。 相关迷宫生成过程和寻路算法在界面上的展现:将迷宫程序中的相关功能,跟界面合理结合,并采用一定的方法展 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。
基于Selenium前端自动化测试工具,对youtube和tiktok数据进行爬虫,可设置自己要爬取的内容和主题,快速便捷。