虽然最近项目比较紧,但是仍坚持每天看几页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允许使用它的客户端来决定算法的变化。
分享到:
相关推荐
javaee struts框架+servlet+jsp+dao+fatory做的房屋祖凌系统 用的是oracle 数据库
之前安装测试fake包时,pip各种安装fake失败,后来找到的这个包,说是fake之前叫fake-fatory,亲测可用
闲暇时间,自己写了个UVM的factory机制的简单实现,大家可以下载看看 Study , UVM
2024-2030全球及中国PCB接触式探头行业研究及十五五规划分析报告
网站界面设计mortal0418代码
PHP毕业设计-校园失物招领系统源码+数据库.zip个人经导师指导并认可通过的高分毕业设计项目,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者。也可作为课程设计、期末大作业。包含全部项目源码、该项目可以直接作为毕设使用。项目都经过严格调试,确保可以运行! PHP毕业设计-校园失物招领系统源码+数据库.zip个人经导师指导并认可通过的高分毕业设计项目,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者。也可作为课程设计、期末大作业。包含全部项目源码、该项目可以直接作为毕设使用。项目都经过严格调试,确保可以运行! PHP毕业设计-校园失物招领系统源码+数据库.zip个人经导师指导并认可通过的高分毕业设计项目,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者。也可作为课程设计、期末大作业。包含全部项目源码、该项目可以直接作为毕设使用。项目都经过严格调试,确保可以运行! PHP毕业设计-校园失物招领系统源码+数据库.zip个人经导师指导并认可通过的高分毕业设计项目,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者。也可
2024年神经酸行业分析报告.pptx
【Java爬虫】信息抓取的实现 完整实例(源码)
rain-drop.PNG
FEDformer.pdf
基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资源交流系统:毕业源码案例设计.rar基于ASP.NET三层模式的网上学习资
完整代码!扫雷游戏,vs2010使用vs2010开发小游戏,这是一个扫雷的游戏,适应于大作业和毕业论文.zip
JDK 8 0 apidoc 带完整索引和目录
可以进行模拟银行服务,有多种功能。
校园共享单车管理系统 软件工程做的课程设计,里面是JSP源码,后台连接数据库,可直接调试运行成功。
去水印版,aspose.words-19.7-jdk17.jar、aspose-words-19.7.pom
NKUcs22级机器学习实验全套代码于此,希望造福学弟学妹。
springboot校园医疗保险管理系统
QPSK的锁相环程序,在MATLAB环境下编写的,用来进行QPSK通信系统的仿真和实际信号载波同步的提取
stm32项目知识领域: 网络安全 技术关键词: 漏洞分析、渗透测试、加密算法 内容关键词: 攻击防范、身份验证、网络流量分析 用途: 学习保护信息系统免受恶意攻击和数据泄露 资源描述: "OWASP官方网站"提供了全面的网络安全知识和工具,包括常见漏洞、安全指南和最佳实践。