组合模式

设计模式@第12章:组合模式

和自甴很熟 提交于 2020-01-10 22:55:14
第12章:组合模式 一、看一个学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院, 一个学院有多个系。如图: ----------清华大学-------------- ----------计算机学院------------ 计算机科学与技术 软件工程 网络工程 ---------信息工程学院----------- 通信工程 信息工程 二、传统方案解决学校院系展示(类图) 传统方案解决学校院系展示存在的问题分析 将 学院看做是学校的子类 , 系是学院的子类 ,这样实际上是站在组织大小来进行分层次的 实际上我们的要求是 :在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系,因此这种方案, 不能很好实现的管理的操作 ,比如对学院、系的 添加,删除,遍历 等 解决方案:把学校、院、系都看做是组织结构,他们之间没有继承的关系,而是一个树形结构,可以更好的实现管理操作。 => 组合 模式 四、 组合模式基本介绍 组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“ 整体-部分 ”的层次关系。 组合模式 依据树形结构来组合对象 ,用来表示部分以及整体层次。 这种类型的设计模式属于结构型模式。 组合模式使得 用户对单个对象和组合对象的访问具有一致性

组合模式( Composite Pattern)

回眸只為那壹抹淺笑 提交于 2020-01-10 02:27:04
参考文档: http://blog.csdn.net/ai92/article/details/298336 定义: 组合多个对象形成树形结构以表示“整体-部分”的结构层次。 设计动机: 这幅图片我们都可以看做是一个文件结构,对于这样的结构我们称之为树形结构。在数据结构中我们了解到可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可以对叶子节点进行相关的操作。我们可以将这颗树理解成一个大的容器,容器里面包含很多的成员对象,这些成员对象即可是容器对象也可以是叶子对象。但是由于容器对象和叶子对象在功能上面的区别,使得我们在使用的过程中必须要区分容器对象和叶子对象,但是这样就会给客户带来不必要的麻烦,作为客户而已,它始终希望能够一致的对待容器对象和叶子对象。这就是组合模式的设计动机 :组合模式定义了如何将容器对象和叶子对象进行递归组合,使得客户在使用的过程中无须进行区分,可以对他们进行一致的处理。 模式实现: Component:抽象构件角色 。它为组合中的对象声明接口,也可以为共有接口实现缺省行为 Leaf:树叶构件角色 。在组合中表示叶节点对象——没有子节点,实现抽象构件角色声明的接口。 Composite:树枝构件角色 。在组合中表示分支节点对象——有子节点,实现抽象构件角色声明的接口;存储子部件。 一种方式是在Component里面声明所有的用来管理子类对象的方法

设计模式-结构型-组合模式

元气小坏坏 提交于 2020-01-09 12:33:07
组合模式(Composite): 定义:   组合模式又叫部分整体模式,它是一种将对象组合成树状的层次结构模式,用来表示"部分-整体"的关系,使用户对单个对象和组合对象具有一致的访问性。 组合模式的角色:   1)抽象构建(Component):它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。   2)树叶构件(Leaf):是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。   3)树枝构件(Composite):是组合中的分支节点对象,它有子节点。它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。    1 internal class Program 2 { 3 private static void Main(string[] args) 4 { 5 // Create a tree structure 6 Composite root = new Composite("root"); 7 root.Add(new Leaf("Leaf A")); 8 root.Add(new Leaf("Leaf B")); 9

换种思路去理解设计模式(中)

落爺英雄遲暮 提交于 2020-01-03 08:34:51
继上一篇 换种思路去理解设计模式(上) 继续讲。如果没有看过上一上一篇博客, 请先点击看看 。要不然直接看这篇会找不着头绪。 7 多个对象组成结构 7.1 过程描述   上一节介绍了如何创建一个对象。但大多数情况,一个对象是不够用的,这时候就需要把对象包装、封装、多对象组合。有时候还需要将一个组合作为一个整体使用,组合要提供对外的接口,也可能会用到系统原有的接口。   下面针对每种情况详细介绍。 7.2 情况1:借用外部接口   有开发经验的人知道,日常大部分开发都是在已有系统基础上开发的。即便是从新开发的系统,也要依赖于一个框架或者库。   所以,我们每时每刻都在用系统已有的接口。但是如果这些接口不满足我们的需求,我们就需要重新对接口封装一下,让其符合当前的规则。就是这个我们日常用的技巧,被GoF总结成为一个模式—— 适配器模式 。   不用看代码和类图,也能明白它的意思。不必太计较代码和类图的细节,重点在于理解设计思想。   顾名思义,适配器就是做一个隔离,起到了解耦的作用。例如我们日常用的笔记本电脑适配器。 7.3 情况2:给对象增加新功能   系统总是在不断的维护和升级当中,也可能在不断的需求变更当中,因此为对象增加新功能,是再常见不过的了。那么如何为对象增加新功能呢?   最直接的回答就是改代码呗。改类型的代码,增加方法、属性等。      对于这种修改

组合模式-Composite

半世苍凉 提交于 2020-01-02 20:43:32
1.看一个学校院系展示需求 编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系。如图: 2 传统方案解决学校院系展示(类图) 3. 传统方案解决学校院系展示存在的问题分析 将 学院看做是学校的子类, 系是学院的子类,这样实际上是站在组织大小来进行分层次的 实际上我们的要求是 :在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系, 因此这种方案, 不能很好实现的管理的操作,比如对学院、系的 添加,删除,遍历等‘ 解决方案:把学校、院、系都看做是组织结构,他们之间没有继承的关系,而是一个树形结构,可以更好的实现管理操作。 => 组合模式 4. 组合模式基本介绍 组合模式(Composite Pattern) ,又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“ 整体- 部分”的层次关系。 组合模式 依据树形结构来组合对象,用来表示部分以及整体层次。 这种类型的设计模式属于 结构型模式 。 组合模式 使得 用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象 5. 组合模式原理类图 Component :这是组合中对象声明接口,在适当情况下,实现所有类共有的接口默认行为,用于访问和管理Component 子部件, Component

C++设计模式(17):组合模式

蹲街弑〆低调 提交于 2019-12-28 07:30:29
一、背景 树形结构 不论在生活中或者是开发中都是一种非常常见的结构,一个 容器对象 (如文件夹)下可以存放多种不同的 叶子对象 或者 容器对象 ,容器对象与叶子对象之间属性差别可能非常大。 由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中必须有区别地对待容器对象和叶子对象,而实际上大多数情况下我们希望一致地处理它们 ,因为对于这些对象的区别对待将会使得程序非常复杂。组合模式为解决此类问题而诞生, 它可以让叶子对象和容器对象的使用具有一致性 。 二、模式定义 组合多个对象形成树形结构以表示具有 “整体—部分” 关系的层次结构。 组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性 ,组合模式又可以称为 “整体—部分”(Part-Whole) 模式,它是一种对象结构型模式。 三、模式角色和UML类图 抽象构建(Component): 它可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等。 叶子节点(Leaf): 它在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。 对于那些访问及管理子构件的方法,可以通过异常等方式进行处理 。 容器构件(Composite):

设计模式-合成复用原则

≡放荡痞女 提交于 2019-12-19 19:15:06
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 合成复用原则: 尽量使用对象组合, 而不是继承来达到复用的目的. 合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象, 使之成为新对象的一部分; 新对象通过委派调用已有对象的方法达到复用的目的. 简言之: 复用时要尽量通过组合/聚合关系(关联关系), 少用继承. 在面向对象设计中, 可以通过两种方法在不同的环境中复用已有的设计和实现, 既*通过组合/聚合关系或者通过继承关系, 但首先应该考虑组合/聚合, *组合/聚合可以使系统更加灵活, 降低类与类之间的耦合度, 一个类的变化对其它类造成的影响较少; 其次才考虑继承关系, 在继承时, 要严格遵循里氏代换原则, 有效使用继承会有助于对问题的理解, 降低复杂度, 而滥用继承反而会增加系统构建和维护的难度以及系统的复杂度, 因此要慎重使用继承复合. 通过继承来进行复用的主要问题在于继承复用会破坏系统的封装性,因为继承会将基类的实现细节暴露给子类,由于基类的内部细节通常对子类来说是可见的,所以这种复用又称“白箱”复用,如果基类发生改变,那么子类的实现也不得不发生改变;从基类继承而来的实现是静态的,不可能在运行时发生改变,没有足够的灵活性;而且继承只能在有限的环境中使用(如类没有声明为不能被继承)。

Design Pattern

旧城冷巷雨未停 提交于 2019-12-19 17:50:35
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 按照每天一个设计模式的节奏,今天进入Composite模式,这个模式在软件开发中还是很容易出现的,尤其界面控件,比如listview是由list和header两个控件组合而成. 当然了,逻辑领域例子也不少, 正如1+2 = 3一样,3 也是个整数,而且可以视为组合型. 这个模式的纠结点在于组合行为是托管在基类还是组合类, 其实就是add/remove/get操作的生命地点. 我个人比较喜欢类的纯粹,所以喜欢有一个Composite的次基类,诚如下面代码所示. 评价: 按照惯例评价, Composite 应该算战斗级别, 在实际案例中, 组合内的逻辑是复杂的, 组合内对象一般也是有顺序和数目要求,同时对方法调用也是需要逻辑处理的, 一般可以看作一个复杂的多子对象的Decorator. // Composite.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <iostream> #include <vector> #include <algorithm> using namespace std; class Composite; class Component { public:

设计模式- 组合模式

旧巷老猫 提交于 2019-12-19 05:50:09
<?php /** * 组合模式 * * 将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户对单个对象和复合对象的使用具有一致性 */ abstract class MenuComponent { public function add ( $component ) { } public function remove ( $component ) { } public function getName ( ) { } public function getUrl ( ) { } public function display ( ) { } } class Menu extends MenuComponent { private $_items = array ( ) ; private $_name = null ; public function __construct ( $name ) { $this - > _name = $name ; } public function add ( $component ) { $this - > _items [ ] = $component ; } public function remove ( $component ) { $key = array_search ( $component , $this - >

设计模式之路 | 组合模式

本秂侑毒 提交于 2019-12-18 15:24:51
组合模式的定义与特点 组合(Composite)模式的定义:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。 组合模式的主要优点有: 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码; 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”; 其主要缺点是: 设计较复杂,客户端需要花更多时间理清类之间的层次关系; 不容易限制容器中的构件; 不容易用继承的方法来增加构件的新功能; 组合模式的结构与实现 组合模式的结构不是很复杂,下面对它的结构和实现进行分析。 1. 模式的结构 组合模式包含以下主要角色。 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。 树枝构件(Composite)角色:是组合中的分支节点对象,它有子节点。它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 Add