组合模式

组合模式

[亡魂溺海] 提交于 2019-11-28 18:07:44
组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。 ——《Head First 设计模式》 也就是说,组合模式是用来呈现树状结构的,利用组合模式,让叶子节点和非叶子节点继承同一个基础类,可以让叶子节点对象和组件(非叶子)节点对象之间的差异得以忽略,从而为客户进程提供更简单统一的调用方式。 类图 从类图中可以看出,组件(非叶子节点)既继承了基础类,也拥有基础类作为一个属性。继承基础类是为了和叶子节点有同一个基础类,从而对客户端屏蔽组件和叶子节点的差异,让客户端有统一接口可以调用,方便客户端进程。拥有基础类作为一个属性是因为组件类不是叶子节点,其叶子节点的数据放在这个属性中。 例子 此处以部门为例子进行说明。假设A部门底下有B、C、D三个部门,C部门底下有E、F部门,B、D、E、F部门都没有子部门。部门之间的层次结构如下图所示 类图 抽象基础类 抽象类Dept中有一个抽象函数description,用于描述本部门的信息。另外三个函数add、remove、getChild在抽象基础类中提供默认实现,主要是考虑到叶子类的情况,这样叶子类继承后只需要实现description函数即可。而非叶子类需要重写这四个函数。因为add、remove、getChild这三个函数对非叶子类有意义而对叶子类无意义。 当然,对于add

JAVA设计模式之组合模式

浪尽此生 提交于 2019-11-28 08:40:03
文章目录 一、组合模式简介 二、组合模式的结构 三、组合模式的角色与职责 四、组合模式的具体实现 使用组合模式 方案设计 类设计 要抱抱才会开心啊~~~~~~~~~~~~ 一、组合模式简介 Composite模式也叫组合模式,是构造型的设计模式之一。通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树。 二、组合模式的结构 三、组合模式的角色与职责 Component (树形结构的节点抽象) 为所有的对象定义统一的接口(公共属性,行为等的定义) 提供管理子节点对象的接口方法 [可选]提供管理父节点对象的接口方法 Leaf (树形结构的叶节点) :Component的实现子类 Composite(树形结构的枝节点) :Component的实现子类 四、组合模式的具体实现 我们在前一个迭代器模式中的三个餐厅合并了,但是并没有重新设计新的菜单,服务员一直抱怨,每次都要记住那么多的接口很麻烦,因此我们开始探索一种能够让服务员只需要一个接口就能遍历所有菜单的形式。 那么我们需要什么呢? 我们需要某种树形结构,可以容纳菜单、子菜单和菜单项 我们需要在每个菜单之间的各个项之间游走 使用组合模式 组合模式能让我们以属性的方式创建对象的结构,书里面包含了组合即菜单以及个别的对象即菜单项。使用组合我们能把相应的操作应用在组合和个别对象上,换句话说我们可以忽略组合和个别对象之间的差异。

Java设计模式之组合模式(Composite Pattern)

荒凉一梦 提交于 2019-11-28 08:39:48
介绍 组合模式是一种结构型设计模式。它一般是 用来创建树状的结构,表示“部分-整体”的层次关系 。由于该模式使用的是 对象组合的方式 来实现的,区别于继承的方式,因此也叫做合成模式。先来看一下它的定义: Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. 将对象组合成树形结构以表示 “部分-整体” 的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 组合模式主要包括三种角色: Componet抽象构件角色。定义对象的框架,可以在其中实现通用的方法、定义类的属性等等,单个对象和组合对象都要继承它。 Leaf叶子组件。相当于树状结构中的叶子,是结构的最下层,下面没有其他组件。 Composite树枝组件。相当于树状结构的分枝节点,下面有其他树枝组件或叶子组件,它相当于一个容器,包含下面的各个组件,是其下各个组件的父亲。 有了这三种角色就可以实现组合模式。组合模式的应用有很多,最常见的是我们的文件系统,一个文件夹下面可以有很多其他的文件夹,并且还可以有很多文件,这里的文件夹就相当于我们的树枝组件(容器)

设计模式之组合(合成)模式

放肆的年华 提交于 2019-11-28 08:39:37
1. 概述   将对象组合成树形结构以表示“部分-整体”的 层次结构 。组合模式使得用户对单个对象和组合对象的使用具有 一致性 。 2. 解决的问题   当希望 忽略单个对象和组合对象的区别,统一使用组合结构中的所有对象(将这种“统一”性封装起来)。 3. 组合模式中的角色   3.1 组合部件(Component):它是一个抽象角色,为要组合的对象提供统一的接口。   3.2 叶子(Leaf):在组合中表示子节点对象,叶子节点不能有子节点。   3.3 合成部件(Composite):定义有枝节点的行为,用来存储部件,实现在Component接口中的有关操作,如增加(Add)和删除(Remove)。 4. 组合模式中两个相互关联的重要概念 1)一个组合对象可以包含单对象或者其他组合对象; 2)组合对象与单对象共享同一个接口。 5. 在对组合对象建模时,需要注意防止死循环 1)在使用递归定义后,要确保组合对象都是树形结构;(在遍历对象模型后,任何节点至多被访问一次,则该模型是一颗树) 2)当环出现在组合模式中时,必须修改算法避免可能出现的死循环。 6. 模式解读   6.1 组合模式的类图      6.2 组合模式举例 /************************************************************************/ /*

设计模式之组合模式(C++)

痞子三分冷 提交于 2019-11-28 08:39:18
设计模式之组合模式 组合模式,将对象组合成属性结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。其UML图如下: 一个组织有很多子组织,而无论子组织是单独一个部门或是一个分组织。该组织都希望把它们当成一样的子组织来管理。举个例子吧,就拿公司来说吧,一个公司总部为了方便管理希望把分公司当成一个部门来管理就行了。比如公司要发奖金了,总公司只用通知自己的所有部门就可以了。对于分公司,只用通知分公司就可以了,而不用一一通知分公司的各个部门。具体的实现就是Composite中有一个自己子组织的列表,当有什么通知要执行时,按顺序通知列表中的子组织就行了。而如果子组织中有组织的话也时执行相同的操作,因为它们都实现了相同的接口。 示例代码如下: // CompositeModel.h文件 # pragma once # include <iostream> # include <string> # include <vector> # include <algorithm> class ComponentPtr { protected : std :: string m_strName ; public : ComponentPtr ( std :: string str ) { m_strName = str ; } virtual void add (

android设计模式之组合模式

≡放荡痞女 提交于 2019-11-28 08:38:55
组合模式(Composite Pattern)也称为部分整体模式(Part-Whole Pattern),结构型设计模式之一,组合模式比较简单,它将一组相似的对象看做一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一的方法去访问相应的对象,以此忽略掉对象与对象集合之间的差别。 组合模式的定义 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 组合模式的使用场景 表示对象的部分-整体结构时。 从一个整体中能够独立出部分模块或功能的场景。 Component:抽象根节点,为组合中的对象的声明接口。在适当情况下,实现实现所有类共有接口的缺省行为。 声明一个接口用于访问和管理Component的子节点。可在递归结构中定义一个接口,用于访问一个父节点,并在合适的地方实现它。 Android源码中的组合模式 View和ViewGroup的嵌套组合 在Android的这个视图层级中,容器一定是ViewGroup,而且只有ViewGroup才能包含其他View。 @UiThread public abstract class ViewGroup extends implements ViewParent, ViewManager { ... ... ... ... } 从继承的角度来说,VIewGroup拥有View类所有的非私有方法

设计模式之----组合模式

空扰寡人 提交于 2019-11-28 08:38:30
设计模式之组合模式 组合模式相关总结 组合模式案例一(餐馆子菜单) 组合模式案例二(目录结构) 组合模式相关总结 在学习的时候看到一个写的 非常好的博客 ,可以好好学习一下。 组合模式为处理树形结构提供了一种较为完美的解决方案,它描述了如何将容器和叶子进行递归组合, 使得用户在使用时无须对它们进行区分 ,可以一致地对待容器和叶子。 组合模式(Composite Pattern):组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。 组合模式的关键是定义了一个抽象构件类(Component),它既可以代表叶子(Leaf),又可以代表容器(中间的),而客户端针对该抽象构件类进行编程,无须知道它到底表示的是叶子还是容器,可以对其进行统一处理。 这种组合模式正是应树形结构而生,所以组合模式的使用场景就是出现树形结构的地方。比如:文件目录显示,多及目录呈现等树形结构数据的操作。 Java中的Swing组件: 在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container 是树枝。 使用场景: 在具有整体和部分的层次结构中,希望通过一种方式忽略整体与部分的差异

Java组合模式(思维导图)

你离开我真会死。 提交于 2019-11-28 04:04:05
图1 组合模式【点击查看图片】 1,以公司职员为例的结构 package com.cnblogs.mufasa.demo3; import java.util.ArrayList; import java.util.List; public class Employee { private String name; private String dept; private int salary; private List<Employee> subordinates; //构造函数 public Employee(String name,String dept, int sal) { this.name = name; this.dept = dept; this.salary = sal; subordinates = new ArrayList<Employee>();//【核心所在】 } public void add(Employee e) { subordinates.add(e); } public void remove(Employee e) { subordinates.remove(e); } public List<Employee> getSubordinates(){ return subordinates; } public String

java设计模式----组合模式

点点圈 提交于 2019-11-27 23:50:46
定义 组合模式(Composite),将对象组合成树形结构以表示‘部分-整体’的层次关系(树状结构)。组合模式使得用户对单个对象和组合对象使用具有一致性。 意图 希望用户可以忽略单个对象和组合对象的区别,统一使用组合结构中的所有对象(封装变化的思想)。 结构图 图1组合模式(Composite)结构图 参与者 Component 它是一个抽象角色,为对象的组合提供统一的接口。 为其派生类提供默认的行为。 通过该接口来访问和管理Child Components(节点后继)。 通过该接口来访问Parent Components(节点前驱)。 Leaf 代表参加组合的叶子对象(叶子没有后继)。 定义组成原始对象的行为。 Composite 定义非叶子对象的行为。 实现Component中的孩子操作行为(如:Add(),Remove() 等)。 在使用组合模式中需要注意一点也是组合模式最关键的地方:叶子对象和组合对象实现相同的接口。这就是组合模式能够将叶子节点和对象节点进行一致处理的原因。 组合对象的关键在于它定义了一个抽象构建类,它既可表示叶子对象,也可表示容器对象,客户仅仅需要针对这个抽象构建进行编程,无须知道他是叶子对象还是容器对象,都是一致对待。 建一个抽象类: package composite; public abstract class Component {

HeadFirst 设计模式

 ̄綄美尐妖づ 提交于 2019-11-27 23:17:09
一、设计原则 封装变化 多用组合,少用继承 针对接口编程,不针对实现编程 为交互对象之间的松紧耦合设计而努力 对扩展开放,都修稿关闭 依赖抽象,不要依赖具体类 最少知识原则:之和朋友交谈 好莱坞原则:别找我,我会找你(由超类主控一切,当他们需要的时候,自然回去调用子类) 类应该只有一个改变的理由 二、设计模式 策略模式 定义算法族,分别封装起来,让他们之间可以互相替换,次模式让算法的变化独立于使用算法的客户 2. 观察者模式 在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新 3. 装饰者模式 动态的将责任附加到对象上。想哟啊扩展功能,装饰者提供有别于继承的另一种选择 要点: 继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式 在我们的设计中,应该允许行为可以被扩展,而无需修改现有的代码 组合和委托可用于在运行时动态地加上新的行为 除了继承,装饰者模式也可以让我们扩展行为 装饰者模式意味着一群装饰者类,这些类用来包装具体组件 装饰者类反应出被装饰者的组件类型(事实上,他们具有相同的类型,都是经过接口或继承实现) 装饰者可以被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的 可以用无数个装饰者包装一个组件 装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型