组合模式

设计模式:组合模式

孤人 提交于 2020-03-09 19:07:56
我们对于这个图片肯定会非常熟悉,这两幅图片我们都可以看做是一个文件结构,对于这样的结构我们称之为树形结构。在数据结构中我们了解到可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作。我们可以将这颗树理解成一个大的容器,容器里面包含很多的成员对象,这些成员对象即可是容器对象也可以是叶子对象。但是由于容器对象和叶子对象在功能上面的区别,使得我们在使用的过程中必须要区分容器对象和叶子对象,但是这样就会给客户带来不必要的麻烦,作为客户而已,它始终希望能够一致的对待容器对象和叶子对象。这就是组合模式的设计动机 :组合模式定义了如何将容器对象和叶子对象进行递归组合,使得客户在使用的过程中无须进行区分,可以对他们进行一致的处理。 一、 模式定义 组合模式组合多个对象形成树形结构以表示“整体-部分”的结构层次。 组合模式对单个对象(叶子对象)和组合对象(组合对象)具有一致性,它将对象组织到树结构中,可以用来描述整体与部分的关系。同时它也模糊了简单元素(叶子对象)和复杂元素(容器对象)的概念,使得客户能够像处理简单元素一样来处理复杂元素,从而使客户程序能够与复杂元素的内部结构解耦。 上面的图展示了计算机的文件系统,文件系统由文件和目录组成,目录下面也可以包含文件或者目录,计算机的文件系统是用递归结构来进行组织的,对于这样的数据结构是非常适用使用组合模式的。

组合模式,树形结构处理

馋奶兔 提交于 2020-03-09 18:59:11
1. 主要优点 组合模式的主要优点如下: (1) 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。 (2) 客户端可以一致地使用一个组合结构或其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。 (3) 在组合模式中增加新的容器构件和叶子构件都很方便,无须对现有类库进行任何修改,符合“开闭原则”。 (4) 组合模式为树形结构的面向对象实现提供了一种灵活的解决方案,通过叶子对象和容器对象的递归组合,可以形成复杂的树形结构,但对树形结构的控制却非常简单。 2. 主要缺点 组合模式的主要缺点如下: 在增加新构件时很难对容器中的构件类型进行限制。有时候我们希望一个容器中只能有某些特定类型的对象,例如在某个文件夹中只能包含文本文件,使用组合模式时,不能依赖类型系统来施加这些约束,因为它们都来自于相同的抽象层,在这种情况下,必须通过在运行时进行类型检查来实现,这个实现过程较为复杂。 3. 适用场景 在以下情况下可以考虑使用组合模式: (1) 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们。 (2) 在一个使用面向对象语言开发的系统中需要处理一个树形结构。 (3) 在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型。

设计模式(十)组合(结构型)

拟墨画扇 提交于 2020-03-09 18:58:11
概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面。 例子1:就是多级树形菜单。 例子2:文件和文件夹目录 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。 有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。 组合模式让你可以优化处理递归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是你每次使 用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就 是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式 分类 将管理子元素的方法定义在Composite类中 将管理子元素的方法定义在Component接口中,这样Leaf类就需要对这些方法空实现。 适用 你想表示对象的部分-整体层次结构 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。 类图 角色 抽象构件角色(component):是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为

设计模式之组合模式

时光总嘲笑我的痴心妄想 提交于 2020-03-09 18:57:27
转载自:http://www.cnblogs.com/chenssy/p/3299719.html 我们对于这个 图片肯定会非常熟悉,这两幅图我们可以看做是一个文件结构,对于这样的结构我们称之为树形结构。在数据结构中我们了解到可以通过调用某个方法来遍历整个树,在我们找到叶子节点后,就可以对叶子节点进行操作。我们可以将这棵树理解为一个大的容器,容器里面包含 许多的成员对象,这些成员对象既可以是容器对象,也可以是叶子对象。但是由于容器对象和叶子对象在功能上的区别,使得我们在使用过程中必须区分容器对象和叶子对象,但是这会给客户带来不必要的麻烦,客户希望能够一致对待容器对象和叶子对象。这就是组合模式的设计动机: 组合模式定义了如何将容器对象和叶子对象进行递归组合,使得客户在使用过程中无须进行区分,可以对他们进行一致处理。 一、 模式定义 组合模式组合多个对象形成树形结构以表示“整体-部分”的结构层次。 组合模式对单个对象(叶子对象)和组合对象(组合对象)具有一致性,它将对象组织到树结构中,可以用来描述整体与部分的关系。同时它也模糊了简单元素(叶子对象)和复杂元素(容器对象)的概念,使得客户能够像处理简单元素一样来处理复杂元素,从而使客户程序能够与复杂元素的内部结构解耦。 上面的图展示了计算机的文件系统,文件系统由文件和目录组成,目录下面也可以包含文件或者目录

组合模式

泪湿孤枕 提交于 2020-03-09 18:57:09
场景引入:树形结构在软件中随处可见,例如操作系统中的目录结构、应用软件中的菜单、办公系统中的公司组织结构等等,如何运用面向对象的方式来处理这种树形结构是组合模式需要解决的问题,组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,它描述了如何将容器对象和叶子对象进行递归组合,使得用户在使用时无须对其进行区分,可以一致地对待容器对象和叶子对象,这就是组成模式的模式动机 定义:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模型让客户端可以统一对待单个对象和组合对象 由上图可知,组合模式包含以下3个角色 (1)Component(抽象构件):它可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。 (2)Leaf(叶子构件):它在组合结构中表示叶子节点对象,它实现了在抽象构件中定义的行为 (3)Composite(容器构件):它在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是容器或叶子节点 组合模式应用实例 1. 实例说明 某软件公司欲开发一个杀毒(AntiVirus)软件,该软件既可以对某个文件夹(Folder)杀毒,也可以对某个指定的文件(File)进行杀毒。该杀毒软件还可以根据各类文件的特点,为不同类型的文件提供不同的杀毒方式,例如图像文件(ImageFile

Java设计模式--组合模式

心不动则不痛 提交于 2020-03-06 16:12:54
一、简介 1.1 模式定义 组合多个对象形成树形结构一表示“整体-部分”的结构层次。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性。 1.2 使用场景 1)需要表示一个对象整体或部分层次,在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异,可以一致地对待他们。 2)让客户能够忽略不同对象层次的变化,客户端可以针对抽象构件编程,无须关心对象层次结构的细节。 3)对象的结构是动态的并且复杂程度不一样,但客户需要一致地处理它们。 1.3 优点 1)组合模式可以清楚地定义层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易,因为它让客户忽略了层次的差异,而它的结构又是动态的,提供来临对象管理的灵活接口,因此组合模式可以方便地对层次结构进行控制。 2)客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不关心自己处理的是单个对象和容器对象的类层次结构,简化了客户端代码。 3)定义了包含叶子对象和容器对象的类层次结构,叶子对象可以被组合成更复杂的容器对象,而这个容器对象又可以被组合,这样不断递归下去,可以形成复杂的树形结构。 4)更容易在组合体内加入对象构件,客户端不必因为加入了新的对象构件而更改原有代码。 1.4 缺点 1)使设计变得更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大挑战性

设计模式前传——学习设计模式你要先知道这些

喜夏-厌秋 提交于 2020-02-26 13:34:05
为什么要学设计模式? 面试经常被问到 以前总觉得设计模式是“花拳绣腿”,实际开发中没什么卵用,其实有好多种设计模式自己在无形中就使用了,只是自己不知道 设计模式是软件开发人员的“标准词汇”,学习设计模式是个人技术能力提高的捷径 设计模式包含了面向对象的精髓,“懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要” 软件设计模式概述 软件设计模式的产生背景 “设计模式”这个术语最初并不是出现在软件设计中,而是被用于建筑领域的设计中。 1987 年,肯特·贝克(Kent Beck)和沃德·坎宁安(Ward Cunningham)首先将建筑领域的模式思想应用在 Smalltalk 中的图形用户接口的生成中,但没有引起软件界的关注。 1994 年,艾瑞克·伽马(ErichGamma)、理査德·海尔姆(Richard Helm)、拉尔夫·约翰森(Ralph Johnson)、约翰·威利斯迪斯(John Vlissides)等 4 位作者合作出版了《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)一书,在本教程中收录了 23 个设计模式,这是设计模式领域里程碑的事件,导致了软件设计模式的突破。这 4 位作者在软件开发领域里也以他们的“四人组”(Gang of Four,

转载——卷积神经网络之卷积计算、作用与思想

☆樱花仙子☆ 提交于 2020-02-25 00:40:32
目录 卷积运算与相关运算 理解卷积 卷积能抽取特征 多层卷积能抽取复杂特征 总结 参考 原文链接: https://www.cnblogs.com/shine-lee/p/9932226.html 卷积运算与相关运算 在计算机视觉领域,卷积核、滤波器通常为较小尺寸的矩阵,比如3×3、5×5等,数字图像是相对较大尺寸的2维(多维)矩阵(张量),图像卷积运算与相关运算的关系如下图所示(图片来自 链接 ),其中𝐹为滤波器,𝑋为图像,𝑂为结果。 相关是将滤波器在图像上滑动,对应位置相乘求和;卷积则先将滤波器旋转180度(行列均对称翻转),然后使用旋转后的滤波器进行相关运算。两者在计算方式上可以等价,有时为了简化,虽然名义上说是”卷积“,但实际实现时是相关。 在二维图像上,使用Sobel Gx滤波器进行卷积如下图所示。 当输入为多维图像(或多通道特征图)时,多通道卷积如下图所示,图中输入图像尺寸为6×6,通道数为3,卷积核有2个,每个尺寸为3×3,通道数为3(与输入图像通道数一致),卷积时,仍是以滑动窗口的形式,从左至右,从上至下,3个通道的对应位置相乘求和,输出结果为2张4×4的特征图。一般地,当输入为𝑚×𝑛×𝑐时,每个卷积核为𝑘×𝑘×𝑐,即每个卷积核的通道数应与输入的通道数相同(因为多通道需同时卷积),输出的特征图数量与卷积核数量一致,这里不再赘述。 理解卷积 这里提供两个理解卷积的角度

设计模式--组合模式

喜夏-厌秋 提交于 2020-02-16 21:22:09
组合模式 定义 :也称为 整体-部分(Part-Whole)模式 ,它的宗旨是通过将 单个对象 (叶子节点)和 组合对象 (树枝节点)用 相同的接口 进行表示,使得客户对单个对象和组合对象的    使用具有一致性。组合模式 一般用来描述 整体 与 部分 的关系,它将对象组织到树形结构中,最顶层的节点称为根节点,根节点下面可以包含 树枝节点 和 叶子节点,    树枝节点下面又可以包含 树枝节点 和 叶子节点。 使用场景 :把 部分和整体的关系用树形结构来表示 ,从而使客户端可以使用统一的方式处理部分对象和整体对象。 工作流程 : 1) 组合模式为处理树形结构提供了完美的解决方案,描述了如何将容器和叶子进行 递归组合 ,使得用户在使用时可以一致性的对待容器和叶子。 2) 当容器对象的指定方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员,并调用执行。其中,使用了递归调用的机制对整个结构进行处理。 核心 : 1) 抽象构建(Component)角色 :定义了叶子和容器构件的共同点 2) 叶子(leaf)构件角色 :无叶子节点 3) 容器(Composite)构件角色 :有容器特征,可以包含子节点 图示 : package com.offcn.designpattern.compositepattern; import java.util.ArrayList; import

访问者模式---行为型

懵懂的女人 提交于 2020-02-15 03:55:36
使用场景: (1) 如果想对一个对象结构实施一些依赖于对象结构中具体类的操作,可以使用访问者模式。 (2) 如果想对一个对象结构中的各个元素进行很多不同的而且不相关的操作,为了避免这些操作使类变得杂乱,可以使用访问者模式。把这些操作分散到不同的访问者对象中去,每个访问者对象实现同一类功能。 (3) 如果对象结构很少变动,但是需要经常给对象结构中的元素对象定义新的操作可以使用访问者模式。 3 相关模式 (1)访问者模式和组合模式 这两个模式可以组合使用。如同前面示例的那样,通过访问者模式给组合对象预留下扩展功能的接口,使得为组合模式的对象结构添加功能非常容易。 (2)访问者模式和装饰模式 这两个模式从表面上看功能有些相似,都能够实现在不修改原对象结构的情况下修改原对象的功能。但是装饰模式更多的是实现对已有功能的加强、修改或者完全全新实现;而访问者模式更多的是实现为对象结构添加新的功能。 (3)访问者模式和解释器模式 这两个模式可以组合使用。解释器模式在构建抽象语法树的时候,是使用组合模式来构建的,也就是说解释器模式解释并执行的抽象语法树是一个组合对象结构,这个组合对象结构是很少对象结构的不同变动的,但是可能经常需要为解释器增加新的功能。解释和执行的功能,这正是访问者模式的优势所在,因此在使用释器模式的时候通常会组合访问者模式来使用。 来源: https://www.cnblogs