`
yueguangyuan
  • 浏览: 333204 次
  • 性别: Icon_minigender_1
  • 来自: 新加坡
社区版块
存档分类
最新评论

Fatory Template Stategy --Head First Design Pattern读书笔记(三)

阅读更多

     虽然最近项目比较紧,但是仍坚持每天看几页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做的房屋祖凌系统

    javaee struts框架+servlet+jsp+dao+fatory做的房屋祖凌系统 用的是oracle 数据库

    fake_factory-9999.9.9-py2.py3-none-any.whl

    之前安装测试fake包时,pip各种安装fake失败,后来找到的这个包,说是fake之前叫fake-fatory,亲测可用

    UVM factory 机制的简单实现(有代码)

    闲暇时间,自己写了个UVM的factory机制的简单实现,大家可以下载看看 Study , UVM

    基于Springboot + Mybatis框架实现的一个简易的商场购物系统.zip

    基于springboot的java毕业&课程设计

    用于 CNO 实验的 MATLAB 脚本.zip

    1.版本:matlab2014/2019a/2021a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    基于卷积神经网络的垃圾分类.zip

    卷积神经网络(Convolutional Neural Networks, CNNs 或 ConvNets)是一类深度神经网络,特别擅长处理图像相关的机器学习和深度学习任务。它们的名称来源于网络中使用了一种叫做卷积的数学运算。以下是卷积神经网络的一些关键组件和特性: 卷积层(Convolutional Layer): 卷积层是CNN的核心组件。它们通过一组可学习的滤波器(或称为卷积核、卷积器)在输入图像(或上一层的输出特征图)上滑动来工作。 滤波器和图像之间的卷积操作生成输出特征图,该特征图反映了滤波器所捕捉的局部图像特性(如边缘、角点等)。 通过使用多个滤波器,卷积层可以提取输入图像中的多种特征。 激活函数(Activation Function): 在卷积操作之后,通常会应用一个激活函数(如ReLU、Sigmoid或tanh)来增加网络的非线性。 池化层(Pooling Layer): 池化层通常位于卷积层之后,用于降低特征图的维度(空间尺寸),减少计算量和参数数量,同时保持特征的空间层次结构。 常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。 全连接层(Fully Connected Layer): 在CNN的末端,通常会有几层全连接层(也称为密集层或线性层)。这些层中的每个神经元都与前一层的所有神经元连接。 全连接层通常用于对提取的特征进行分类或回归。 训练过程: CNN的训练过程与其他深度学习模型类似,通过反向传播算法和梯度下降(或其变种)来优化网络参数(如滤波器权重和偏置)。 训练数据通常被分为多个批次(mini-batches),并在每个批次上迭代更新网络参数。 应用: CNN在计算机视觉领域有着广泛的应用,包括图像分类、目标检测、图像分割、人脸识别等。 它们也已被扩展到处理其他类型的数据,如文本(通过卷积一维序列)和音频(通过卷积时间序列)。 随着深度学习技术的发展,卷积神经网络的结构和设计也在不断演变,出现了许多新的变体和改进,如残差网络(ResNet)、深度卷积生成对抗网络(DCGAN)等。

    基于 Yolov5的检测模型

    运行程序 1、测试.pt模型文件 1.在pycharm里打开下载的yolov5环境,在根目录打开runs文件,找到trains文件中的best_1.pt即为训练最优模型。 2.在根目录找到 detect.py 文件,修改代码221行默认路径至模型路径,222行路径更改至所需测试图片路径,点击运行。 2、测试.onnx模型文件 1.在pycharm里打开下载的yolov5环境,在根目录打开 export.py 文件,修改默认输出模型类型为onnx,选择best_1.pt输入模型,点击运行。 2.在根目录找到detect_onnx.py文件,修改代码221行默认路径至模型路径,222行路径更改至所需测试图片路径,点击运行。

    郁郁苍苍---基于SpringBoot的多人社区项目.zip

    基于springboot的java毕业&课程设计

    华为FusionAccess桌面云解决方案基于华为FsionCompute云平台的一款虚拟化桌面应用

    华为桌面云解决方案 桌面云架构VDI和IDV VDI:虚拟桌面架构。特点是计算和数据都在云端,集中管理,集中运行。 IDV:智能桌面虚拟化。特点是镜像集中管理,计算和数据还是在终端,集中管理,分散运行。 (从方案的主推厂商看, 业界华为、思杰、Vmware(IDC国内桌面云市场份额排名前三)都主推VDI,目前推IDV架构的只有锐捷、噢易等少数国内厂商)

    一个基于SpringBoot+Editor.md的 API接口文档.zip

    基于springboot的java毕业&课程设计

    基于OpenCV的交通路口红绿灯控制系统设计 python毕业设计-源码+全部数据+使用文档(高分项目).zip

    基于OpenCV的交通路口红绿灯控制系统设计 python毕业设计-源码+全部数据+使用文档(高分项目).zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 基于OpenCV的交通路口红绿灯控制系统设计 python毕业设计-源码+全部数据+使用文档(高分项目).zip基于OpenCV的交通路口红绿灯控制系统设计 python毕业设计-源码+全部数据+使用文档(高分项目).zip基于Op

    课设毕设基于SSM的知识产权管理系统源码可运行.zip

    课设毕设基于SSM的知识产权管理系统源码可运行.zip

    基于卷积神经网络的人脸识别.zip

    卷积神经网络(Convolutional Neural Networks, CNNs 或 ConvNets)是一类深度神经网络,特别擅长处理图像相关的机器学习和深度学习任务。它们的名称来源于网络中使用了一种叫做卷积的数学运算。以下是卷积神经网络的一些关键组件和特性: 卷积层(Convolutional Layer): 卷积层是CNN的核心组件。它们通过一组可学习的滤波器(或称为卷积核、卷积器)在输入图像(或上一层的输出特征图)上滑动来工作。 滤波器和图像之间的卷积操作生成输出特征图,该特征图反映了滤波器所捕捉的局部图像特性(如边缘、角点等)。 通过使用多个滤波器,卷积层可以提取输入图像中的多种特征。 激活函数(Activation Function): 在卷积操作之后,通常会应用一个激活函数(如ReLU、Sigmoid或tanh)来增加网络的非线性。 池化层(Pooling Layer): 池化层通常位于卷积层之后,用于降低特征图的维度(空间尺寸),减少计算量和参数数量,同时保持特征的空间层次结构。 常见的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling)。 全连接层(Fully Connected Layer): 在CNN的末端,通常会有几层全连接层(也称为密集层或线性层)。这些层中的每个神经元都与前一层的所有神经元连接。 全连接层通常用于对提取的特征进行分类或回归。 训练过程: CNN的训练过程与其他深度学习模型类似,通过反向传播算法和梯度下降(或其变种)来优化网络参数(如滤波器权重和偏置)。 训练数据通常被分为多个批次(mini-batches),并在每个批次上迭代更新网络参数。 应用: CNN在计算机视觉领域有着广泛的应用,包括图像分类、目标检测、图像分割、人脸识别等。 它们也已被扩展到处理其他类型的数据,如文本(通过卷积一维序列)和音频(通过卷积时间序列)。 随着深度学习技术的发展,卷积神经网络的结构和设计也在不断演变,出现了许多新的变体和改进,如残差网络(ResNet)、深度卷积生成对抗网络(DCGAN)等。

    基于springboot-mqtt的温度、湿度、六氟化硫浓度实时监控系统.zip

    基于springboot的java毕业&课程设计

    房地产企业财务风险的成因与防范对策-以万科集团为例.docx

    房地产企业财务风险的成因与防范对策-以万科集团为例.docx

    基于SpringBoot框架的中小企业完全开源的ERP.zip

    基于springboot的java毕业&课程设计

    基于springboot的动漫弹幕网站.zip

    基于springboot的java毕业&课程设计

    基于SpringBoot + Vue的电影售票及影院管理系统.zip

    基于springboot的java毕业&课程设计

    基于Python+定向爬虫的商品比价系统的实现的设计与实现+详细文档+全部资料(高分毕业设计).zip

    基于Python+定向爬虫的商品比价系统的实现的设计与实现+详细文档+全部资料(高分毕业设计).zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。基于Python+定向爬虫的商品比价系统的实现的设计与实现+详细文档+全部资料(高分毕业设计).zip本资源中的源码都是经过本地编译过可运行的,评审分达到95分以上。资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求。

    MySQL8.4.0 LTS(mysql-8.4.0-solaris11-sparc-64bit.tar)

    MySQL8.4.0 LTS(mysql-8.4.0-solaris11-sparc-64bit.tar)适用于Oracle Solaris 11 (SPARC)

Global site tag (gtag.js) - Google Analytics