结构型模式之组合

重新看组合/合成(Composite)模式,发现它并不像自己想象的那么简单,单纯从整体和部分关系的角度去理解还是不够的,并且还有一些通俗的模式讲解类的书,由于其举的例子太过“通俗”,以致让人理解产生偏差,不过设计模式本身就是一种程序设计思想,不同的人当然会产生具有偏差性质的理解。

GOF对组合模式的定义是:将对象组合成树形结构以表示“部分 -整体”的层次结构。 Composite使得用户对单个对象和组合对象的使用具有一致性 。这里,“用户对单个对象和组合对象的使用具有一致性”,这是Composite模式产生的效果。从表示形式来看,Composite表示的是“部分-整体”的关系,但是,往往忽略了效果。下图是Composite模式的结构图:

Composite模式的对象结果如下:

Composite类提供对Leaf类对象的管理方法,如Add(),Remove(),GetChild()方法,这些方法的定义可以有两种方法:一个是放在Component的顶层父类中,这样所有的子类(包括Leaf类)都会集成该方法,但Leaf类可以选择不实现这些方法;另外一个是将对Leaf对象操作的方法放到Composite类中,并不是放到Component类中。现在以GOF所著书中所给的例子为例,写出组合模式的代码,类图结构如下:

代码如下:

 1 abstract class Graphic{
 2     
 3     public void Draw(){}
 4     public void Add(Graphic g){}
 5     public void Remove(Graphic g){}
 6     public Graphic GetChild(int index){return null;}
 7 }
 8 class Line extends Graphic{
 9     public void Draw(){
10         System.out.println("Draw a Line");
11     }
12 }
13 class Rectange extends Graphic{
14     public void Draw(){
15         System.out.println("Draw a Rectange");
16     }
17 }
18 class Text extends Graphic{
19     public void Draw(){
20         System.out.println("Draw a Text");
21     }
22 }
23 class Picture extends Graphic{
24     private Vector<Graphic> vec=new Vector<Graphic>();
25     public void Draw(){
26         for(Graphic g : vec){
27             g.Draw();
28         }
29     }
30     public void Add(Graphic g){
31         vec.add(g);
32     }
33     public void Remove(Graphic g){
34         try{
35             vec.remove(g);
36         }catch(Exception e){
37             
38         }
39     }
40     public Graphic GetChild(int index){
41         return vec.get(index);
42     }
43 }
44 public class Test{
45     public static void main(String[] args){
46         Picture p=new Picture();
47         p.Add(new Text());
48         p.Add(new Rectange());
49         p.Add(new Line());
50         p.Draw();
51         }
52 }
View Code

适用Composite模式的情况:

1、想要表示对象的部分-整体层次结构

2、希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

第一句话很好理解,第二句话该怎么理解呢?我的理解是,如果有一个方法Visist(Component con){con.Draw();}实现一个动作,这时候它并不需要知道是处理一个叶子结点对象还是一个组合对象,对于传进来的叶子结点对象,可以直接处理请求,如果是一个Composite,则将请求发给它的子部件,并且在转发请求之前/后还可以执行一些辅助操作。有人举过一个例子:文件和文件夹,该实现可以用组合模式,文件是Leaf,文件夹是Composite,我们可以单建文件对象,也可创建一个具有目录结构的文件夹对象,文件夹下面可以放文件对象,也可以放文件夹对象。

为了提高系统的可复用性,有一些设计原则,其中有一条“组合/聚合复用原则”,就是优先使用“组合/聚合”,而非继承,这里说的组合是对象组合,也就是一个对象在运行时期动态获得其他对象的引用,从而达到不用继承而能扩展功能的效果;显然,对象组合的使用范围更大,和这里的组合模式不是同一个概念,前者毕竟是一个“设计原则”,而后者则是一个成型的“模式”,原则的使用范围当然更广了。

通过今天的总结,对组合模式又有了进一步的认识,感谢GOF、《Java与模式》、《Thinking in Patterns》。

 

转载于:https://www.cnblogs.com/codeMedita/p/7354847.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391689.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络原理笔记-三次握手

三次握手协议指的是在发送数据的准备阶段&#xff0c;服务器端和客户端之间需要进行三次交互&#xff1a; 第一次握手&#xff1a;客户端发送syn包(synj)到服务器&#xff0c;并进入SYN_SEND状态&#xff0c;等待服务器确认&#xff1b; 第二次握手&#xff1a;服务器收到syn包…

Bigmart数据集销售预测

Note: This post is heavy on code, but yes well documented.注意&#xff1a;这篇文章讲的是代码&#xff0c;但确实有据可查。 问题描述 (The Problem Description) The data scientists at BigMart have collected 2013 sales data for 1559 products across 10 stores in…

数据特征分析-帕累托分析

帕累托分析(贡献度分析)&#xff1a;即二八定律 目的&#xff1a;通过二八原则寻找属于20%的关键决定性因素。 随机生成数据 df pd.DataFrame(np.random.randn(10)*10003000,index list(ABCDEFGHIJ),columns [销量]) #避免出现负数 df.sort_values(销量,ascending False,i…

dt决策树_决策树:构建DT的分步方法

dt决策树介绍 (Introduction) Decision Trees (DTs) are a non-parametric supervised learning method used for classification and regression. The goal is to create a model that predicts the value of a target variable by learning simple decision rules inferred f…

读C#开发实战1200例子记录-2017年8月14日10:03:55

C# 语言基础应用&#xff0c;注释 "///"标记不仅仅可以为代码段添加说明&#xff0c;它还有一项更重要的工作&#xff0c;就是用于生成自动文档。自动文档一般用于描述项目&#xff0c;是项目更加清晰直观。在VisualStudio2015中可以通过设置项目属性来生成自动文档。…

数据特征分析-正太分布

期望值&#xff0c;即在一个离散性随机变量试验中每次可能结果的概率乘以其结果的总和。 若随机变量X服从一个数学期望为μ、方差为σ^2的正态分布&#xff0c;记为N(μ&#xff0c;σ^2)&#xff0c;其概率密度函数为正态分布的期望值μ决定了其位置&#xff0c;其标准差σ决定…

r语言调用数据集中的数据集_自然语言数据集中未解决的问题

r语言调用数据集中的数据集Garbage in, garbage out. You don’t have to be an ML expert to have heard this phrase. Models uncover patterns in the data, so when the data is broken, they develop broken behavior. This is why researchers allocate significant reso…

数据特征分析-相关性分析

相关性分析是指对两个或多个具备相关性的变量元素进行分析&#xff0c;从而衡量两个变量的相关密切程度。 相关性的元素之间需要存在一定的联系或者概率才可以进行相关性分析。 相关系数在[-1,1]之间。 一、图示初判 通过pandas做散点矩阵图进行初步判断 df1 pd.DataFrame(np.…

获取所有权_住房所有权经济学深入研究

获取所有权Note from Towards Data Science’s editors: While we allow independent authors to publish articles in accordance with our rules and guidelines, we do not endorse each author’s contribution. You should not rely on an author’s works without seekin…

getBoundingClientRect说明

getBoundingClientRect用于获取某个元素相对于视窗的位置集合。 1.语法&#xff1a;这个方法没有参数。 rectObject object.getBoundingClientRect() 2.返回值类型&#xff1a;TextRectangle对象&#xff0c;每个矩形具有四个整数性质&#xff08; 上&#xff0c; 右 &#xf…

robot:接口入参为图片时如何发送请求

https://www.cnblogs.com/changyou615/p/8776507.html 接口是上传图片&#xff0c;通过F12抓包获得如下信息 由于使用的是RequestsLibrary&#xff0c;所以先看一下官网怎么传递二进制文件参数&#xff0c;https://2.python-requests.org//en/master/user/advanced/#post-multi…

已知两点坐标拾取怎么操作_已知的操作员学习-第3部分

已知两点坐标拾取怎么操作有关深层学习的FAU讲义 (FAU LECTURE NOTES ON DEEP LEARNING) These are the lecture notes for FAU’s YouTube Lecture “Deep Learning”. This is a full transcript of the lecture video & matching slides. We hope, you enjoy this as mu…

缺失值和异常值处理

一、缺失值 1.空值判断 isnull()空值为True&#xff0c;非空值为False notnull() 空值为False&#xff0c;非空值为True s pd.Series([1,2,3,np.nan,hello,np.nan]) df pd.DataFrame({a:[1,2,np.nan,3],b:[2,np.nan,3,hello]}) print(s.isnull()) print(s[s.isnull() False]…

特征工程之特征选择_特征工程与特征选择

特征工程之特征选择&#x1f4c8;Python金融系列 (&#x1f4c8;Python for finance series) Warning: There is no magical formula or Holy Grail here, though a new world might open the door for you.警告 &#xff1a; 这里没有神奇的配方或圣杯&#xff0c;尽管新世界可…

版本号控制-GitHub

前面几篇文章。我们介绍了Git的基本使用方法及Gitserver的搭建。本篇文章来学习一下怎样使用GitHub。GitHub是开源的代码库以及版本号控制库&#xff0c;是眼下使用网络上使用最为广泛的服务&#xff0c;GitHub能够托管各种Git库。首先我们须要注冊一个GitHub账号&#xff0c;打…

数据标准化和离散化

在某些比较和评价的指标处理中经常需要去除数据的单位限制&#xff0c;将其转化为无量纲的纯数值&#xff0c;便于不同单位或量级的指标能够进行比较和加权。因此需要通过一定的方法进行数据标准化&#xff0c;将数据按比例缩放&#xff0c;使之落入一个小的特定区间。 一、标准…

熊猫tv新功能介绍_熊猫简单介绍

熊猫tv新功能介绍Out of all technologies that is introduced in Data Analysis, Pandas is one of the most popular and widely used library.在Data Analysis引入的所有技术中&#xff0c;P andas是最受欢迎和使用最广泛的库之一。 So what are we going to cover :那么我…

数据转换软件_数据转换

数据转换软件&#x1f4c8;Python金融系列 (&#x1f4c8;Python for finance series) Warning: There is no magical formula or Holy Grail here, though a new world might open the door for you.警告 &#xff1a;这里没有神奇的配方或圣杯&#xff0c;尽管新世界可能为您…

10张图带你深入理解Docker容器和镜像

【编者的话】本文用图文并茂的方式介绍了容器、镜像的区别和Docker每个命令后面的技术细节&#xff0c;能够很好的帮助读者深入理解Docker。这篇文章希望能够帮助读者深入理解Docker的命令&#xff0c;还有容器&#xff08;container&#xff09;和镜像&#xff08;image&#…

matlab界area_Matlab的数据科学界

matlab界area意见 (Opinion) My personal interest in Data Science spans back to 2011. I was learning more about Economies and wanted to experiment with some of the ‘classic’ theories and whilst many of them held ground, at a micro level, many were also pur…