7.5.1.1复合设计模式(THE COMPOSITE DESIGN PATTERN)

复合模式可以把几个对象组合成一个复合对象,使用这种的方法与使用基本对象一样。图 7.6 显示了面向对象实现这种模式的通常方法。

图 7.6CompositeComponent 是包含其他组件集合的类;它继承自 AbstractComponent,因此,能够使用基本组件的地方,也一样可以使用其他组件,比如,ConcreteComponent。

复合对象用复合类表示,程序能够使用 AbstractComponent 类来处理,因此,不需要知道基本对象与复合对象之间的区别。我们还可以看一个使用虚拟方法的示例,称为 Operatio;在 CompositeComponent 类中,它在 components 集合中的所有对象上迭代,并调用 Operation 方法。在我们的文档表示中,可以找到类似的情况。当使用 SplitPart,把一个部分拆分为多列或行时,我们把它当作普通文档部分看待,与处理其他部分的方式完全相同。这部分由保存在列表中的其他部分组合而成。我们可以重写图
7.6 普通示例,使用与 F# 递归差别联合类型相同的方式:

type AbstractComponent

| CompositeComponent oflist<AbstractComponent>

| ConcreteComponent of (...)

| (...)

在这个示例中,复合值表示成除了其他基本组件之外的可选值,它递归地引用 AbstractComponent 类型,把这个类型的值保存在表示组合对象的列表中。当处理 AbstractComponent 类型的值时,我们不需要区别对待组合值和基本值,这正是这种设计模式的主要目标。

在函数式编程中,组合是类型的公开表现。因此,类型的任何用户都知道组件由组合创建,用在写基本的处理函数时,可以使用,正如我们在实现 mapDocument 操作时所做的。

使用函数式数据结构,重点是在已有类型上增加新函数的能力,因此,使组合公开,是正确的设计决策。这样,函数式代码也不需要定义 Operation 方法,在面向对象的表示方法中,它是 AbstractComponent 类型的一部分;使用该类型的任何操作可以独立实现,与处理函数的类型相同。

F# 有一个高级功能,称为活动模式(active patterns),在一定程度上能够封装组合。这就能够能够公开组合,而不仅是整个差别联合类型,这对开发F# 库是有用的。我们在书中不讨论此功能的细节,你可以在本书的网站上找到更多的内容。

时间: 2024-08-28 23:52:58

7.5.1.1复合设计模式(THE COMPOSITE DESIGN PATTERN)的相关文章

Composite Design Pattern 组合设计模式

组合设计模式,就是可以把多个类组合在一个大类中,形成一个树形结构. #include <set> #include <iostream> #include <string> using namespace std; class Coporate { protected: string name; set<Coporate *> coporate; public: explicit Coporate(string n = "", strin

简单工厂设计模式(Simple Factory Design Pattern)

[引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见解的是,区分了设计模式(Design Pattern),结构模式(Architecture Pattern),架构类型(Architecture Style). 如下图所示 Design Pattern:是基于代码层面的,就是针对解决功能模块之间的问题而采用恰当的设计模式,比如依赖注入,简单工厂,适

MVC是一种用于表示层设计的复合设计模式

MVC是一种用于表示层设计的复合设计模式.M.V.C分别表示模型(Model).View(视图).Controller(控制器).它们的职责如下: 它们之间的交互有以下几种:      1.当用户在视图上做任何需要调用模型的操作时,它的请求将被控制器截获.      2.控制器按照自身指定的策略,将用户行为翻译成模型操作,调用模型相应逻辑实现.      3.控制器可能会在接到视图操作时,指定视图做某些改变.      4.当模型的状态发生改变时,将通过某种方式通知视图.      5.视图可以

设计模式(Design pattern)概述

设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结, 使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性 设计框架 可复用面向对象软件系统一般划分为两大类:应用程序工具箱和框架(Framework) 我们平时开发的具体软件都是应用程序 而框架是构成一类特定软件可复用设计的一组相互协作的类 框架通常定义了应用体系的整体结构类和对象的关系等等设计参数,以便于具体应用实现者能集中精力于应用本身的特定细节. 框架主要记录软件应用中

DP什么意思 design pattern 设计模式

DP  design pattern 大话设计模式  中的DP 是设计模式的意思 设计模式的书 ,最经典最原始的就是 GOF 的<设计模式>了. 设计模式的书基本上大多是以这 20 多个模式分开讲.含<大话设计模式> 学了 OOL 写的程序基本上是 OB 的. 只有慢慢掌握了 DP 才能写出真正的 OO 程序. 思想 -> 设计原则 -> DP -> OOD

设计模式 - 代理模式(proxy pattern) 未使用代理模式 详解

代理模式(proxy pattern) 未使用代理模式 详解 本文地址: http://blog.csdn.net/caroline_wendy 部分代码参考: http://blog.csdn.net/caroline_wendy/article/details/37698747 如果需要监控(monitor)类的某些状态, 则需要编写一个监控类, 并同过监控类进行监控. 但仅仅局限于本地, 如果需要远程监控, 则需要使用代理模式(proxy pattern). 具体方法: 1. 类中需要提供

设计模式 - 迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解

迭代器模式(iterator pattern) Java 迭代器(Iterator) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考迭代器模式(iterator pattern): http://blog.csdn.net/caroline_wendy/article/details/35254643 Java的标准库(util)中包含迭代器接口(iterator interface), import java.util.Iterator; 继承(

设计模式 - 外观模式(facade pattern) 详解

外观模式(facade pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 外观模式(facade pattern): 提供了一个统一的接口, 用来访问子系统中的一群接口. 外观定义了一个高层接口, 让子系统更容易使用. 外观模式包含三个部分: 1. 子系统: 子类, 单个复杂子类 或 多个子类; 2. 外观(facade)类: 把子系统设计的更加容易使用; 3. 客户: 只需要调用外观类. 与适配器模式(adapter pattern)的

Design Pattern 设计模式1 - Strategy 1

实现 : Defferent Heros attack Defferently. - 不同的英雄使用不用的招数 Strategy设计的思路: 基类A,更加小的基类B,新的继承类C: 1 从基类A中抽出一个更加小的基类B 2 利用这个更加小的基类B实现不同的效果 3 把这个更加小的基类B包含进基类A中去 4 新的继承类C只需要和基类A打交道,设计不同行为,不需要理会更加小的基类B #pragma once #ifndef _STRATEGY_HEROS_H #define _STRATEGY_HE