虽然最近项目比较紧,但是仍坚持每天看几页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的核心部分,用于动态地创建和配置验证组件。...
数学建模学习资料 神经网络算法 参考资料-Matlab 共26页.pptx
happybirthday2 升级版生日祝福密码0000(7).zip
本项目是一个基于SSM框架的税务门户网站实现,结合了Vue技术,旨在提供一个全面的税务信息管理平台。该项目主要功能包括税务信息查询、税务申报、税务政策浏览及用户管理等多个模块。通过这些功能,用户可以方便地查询和管理税务相关的各类信息,同时也能及时了解最新的税务政策和规定。 项目采用SSM框架,即Spring、Spring MVC和MyBatis,这三者的结合为项目提供了强大的后端支持,确保了数据的安全性和系统的稳定性。前端则采用Vue.js框架,以其高效的数据绑定和组件化开发模式,提升了用户界面的响应速度和用户体验。 开发此项目的目的不仅是为了满足计算机相关专业学生在毕业设计中的实际需求,更是为了帮助Java学习者通过实战练习,深入理解并掌握SSM框架的应用,从而在实际工作中能够更好地运用这些技术。
php7.4.33镜像7z压缩包
本项目是一个基于Java的珠宝购物网站系统,采用SSM框架进行开发,旨在为计算机相关专业学生提供一个实践平台,同时也适合Java学习者进行实战练习。项目的核心功能涵盖商品展示、用户注册登录、购物车管理、订单处理和支付系统等。通过这一系统,用户可以浏览各类珠宝商品,包括详细的商品描述、高清图片和价格信息,同时能够方便地添加商品至购物车,并进行结算和支付操作。 在技术实现方面,项目运用了Spring、Spring MVC和MyBatis三大框架,确保系统的稳定性和扩展性。Spring负责业务逻辑层,提供依赖注入和面向切面编程的支持;Spring MVC则处理Web层的请求和响应,实现MVC设计模式;MyBatis作为持久层框架,简化了数据库操作。 此外,项目采用JSP技术进行前端页面展示,结合HTML、CSS和JavaScript等技术,为用户提供友好的交互界面。
基于java的高校大学生党建系统设计与实现.docx
本项目是一个基于Python-Django框架开发的疫情数据可视化分析系统,旨在为计算机相关专业的学生提供一个实践平台,同时也适用于需要进行项目实战练习的同学。项目集成了疫情数据的收集、处理、分析和可视化功能,为用户提供了一个直观、高效的数据分析环境。 在功能方面,系统能够自动抓取最新的疫情数据,包括确诊、疑似、治愈和死亡人数等关键指标。数据处理模块则负责清洗和整理这些数据,以确保分析的准确性。分析模块采用了多种统计方法和机器学习算法,以揭示疫情的发展趋势和潜在模式。可视化模块则通过图表和地图等形式,直观地展示了分析结果,便于用户理解和分享。 项目的开发框架选择了Django,这是一个高级Python Web框架,它鼓励快速开发和清晰、务实的设计。Django的强大功能和灵活性,使得项目能够快速响应需求变化,同时保证了系统的稳定性和安全性。
果树领养计划.docx
环境说明:开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat 开发软件:eclipse/myeclipse/idea Maven包:Maven 浏览器:谷歌浏览器。 项目均可完美运行 基于Java的云平台信息安全攻防实训平台提供了以下核心功能: 1. **实训课程与项目**:平台提供了丰富多样的实训课程和项目,覆盖网络安全基础知识、漏洞挖掘与利用、渗透测试技术、安全防护策略等多个领域。 2. **在线学习模块**:学员可以通过在线学习模块观看教学视频、阅读文档资料,系统地学习信息安全知识。 3. **虚拟实验室环境**:平台提供虚拟实验室环境,学员可以在模拟的真实网络场景中进行攻防演练,包括漏洞扫描、攻击测试和防御措施的学习。 4. **教学管理功能**:教师可以创建和管理课程内容,制定教学计划,布置实训作业和考试任务。 5. **监控和统计功能**:教师可以实时了解学员的学习进度、实践操作情况和考试成绩,进行有针对性的指导和辅导。 6. **平台管理功能**:管理员负责用户管理、资源分配、系统安全维护等,确保平台稳定运行和实训环境的安全性。 7. **实时监控和评估**:系统具备实时监控和评估功能,能够及时反馈学生的操作情况和学习效果。 8. **用户认证和授权机制**:平台采用了严格的用户认证和授权机制,确保数据的安全性和保密性。 这些功能共同构建了一个功能丰富、操作便捷的实训环境,旨在提升学员的信息安全技能,为信息安全领域的发展输送专业人才。
基于GrampusFramework的轻量级单体RBAC权限管理系统
内容概要:本文档全面整理了软考(中级-软件设计师)的关键知识点,涵盖了计算复杂度、网络协议、数据结构、编程语言、数据库理论、软件测试、编译原理、设计模式、安全协议等多个方面的内容。具体涉及环路复杂度计算、SSH协议、数据字典与数据流图、对象的状态与数字签名、编程语言分类、海明码、著作权法、物理层与数据链路层设备、归纳法与演绎法、模块间耦合、能力成熟度模型集成、配置管理与风险管理、数据库关系范式、内存技术、计算机网络端口、路由协议、排序算法、中间代码、软件测试类型、编译器各阶段任务、设计模式、耦合与内聚、计算机病毒种类等。 适用人群:备考软考(中级-软件设计师)的技术人员,尤其是有一定工作经验但希望进一步提升自身技能和知识的IT从业人员。 使用场景及目标:帮助考生系统梳理考试重点,理解和掌握软件设计师应具备的专业知识和技术。适合考前复习和巩固基础知识。文档还可以作为参考资料,用于日常工作中遇到相关问题时查阅。 其他说明:本文档不仅提供了丰富的知识点,还附带了一些关键术语的定义和详细的解释,确保读者能够全面理解相关内容。建议在复习过程中结合实际案例进行练习,加深理解。
数学建模学习资料 神经网络算法 Hopfield网络 共58页.pptx
工作寻(JobHunter)是一款招聘信息整合的网站,目前固定的模板有拉勾网,中华英才网,前程无忧。工作寻可以在线通过关
本项目是基于Python实现的协同过滤音乐推荐系统,旨在为计算机相关专业学生提供一个完整的毕设实战案例。项目以协同过滤算法为核心,通过分析用户历史行为数据,为用户推荐符合其兴趣偏好的音乐。 主要功能包括用户兴趣建模、音乐推荐生成以及用户反馈机制。系统能够实时捕捉用户听歌行为,动态更新用户兴趣模型,从而更精准地推送个性化音乐推荐。同时,系统设计了友好的用户界面,使用户能够方便地获取推荐音乐,并通过反馈机制不断完善推荐算法。 在技术框架方面,项目采用了Python编程语言,借助scikit-learn等机器学习库实现协同过滤算法,并结合Flask框架搭建了Web服务,确保了系统的性能和稳定性。此项目的开发,不仅能够帮助学生深入理解协同过滤算法及音乐推荐系统的工作原理,还能提升其软件开发和项目管理能力。
微型餐饮补正备案材料通知书.docx
食品生产许可质量跟踪监督建议书.docx
基于django的音乐推荐系统.zip