组合模式

C++设计模式之组合模式(composite)(结构型)

时光毁灭记忆、已成空白 提交于 2020-01-27 03:12:33
对于树形结构,当容器对象(如文件夹)的某一个方法被调用时,将遍历整个树形结构,寻找也包含这个方法的成员对象(可以是容器对象,也可以是叶子对象,如子文件夹和文件)并调用执行。(递归调用) 由于容器对象和叶子对象在功能上的区别,在使用这些对象的客户端代码中必须有区别地对待容器对象和叶子对象,而实际上大多数情况下客户端希望一致地处理它们,因为对于这些对象的区别对待将会使得程序非常复杂。 组合模式描述了如何将容器对象和叶子对象进行递归组合,使得 用户在使用时无须对它们进行区分,可以一致地对待容器对象和叶子对象,这就是组合模式 的模式动机。 一、模式定义 组合模式(Composite Pattern):组合多个对象形成树形结构以表示“整体-部分”的结构层次。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性。 组合模式又可以称为“整体-部分”(Part-Whole)模式,属于对象的结构模式,它将对象组织到树结构中,可以用来描述整体与部分的关系。 组合模式的分类 1) 安全组合模式: 将管理子元素的方法定义在 Composite 类中。 2) 透明组合模式: 将管理子元素的方法定义在 Component 接口中,这样Leaf类就需要对这些方法空实现。 适用性 • 需要表示一个对象整体或部分层次,在具有整体和部分的层次结构中,希望 通过一种方式忽略整体与部分的差异

c++设计模式之一组合模式

风格不统一 提交于 2020-01-27 01:09:02
问题描述 上图,是一个公司的组织结构图,总部下面有多个子公司,同时总部也有各个部门,子公司下面有多个部门。如果对这样的公司开发一个OA系统,作为程序员的你,如何设计这个OA系统呢?先不说如何设计实现,接着往下看,看完了下面的内容,再回过头来想怎么设计这样的OA系统。 什么是组合模式? 在GOF的《设计模式:可复用面向对象软件的基础》一书中对组合模式是这样说的:将对象组合成树形结构以表示“部分-整体”的层次结构。组合(Composite)模式使得用户对单个对象和组合对象的使用具有一致性。 组合模式(Composite)将小对象组合成树形结构,使用户操作组合对象如同操作一个单个对象。组合模式定义了“部分-整体”的层次结构,基本对象可以被组合成更大的对象,而且这种操作是可重复的,不断重复下去就可以得到一个非常大的组合对象,但这些组合对象与基本对象拥有相同的接口,因而组合是透明的,用法完全一致。 我们这样来简单的理解组合模式,组合模式就是把一些现有的对象或者元素,经过组合后组成新的对象,新的对象提供内部方法,可以让我们很方便的完成这些元素或者内部对象的访问和操作。我们也可以把组合对象理解成一个容器,容器提供各种访问其内部对象或者元素的API,我们只需要使用这些方法就可以操作它了。 UML类图 Component: 为组合中的对象声明接口; 在适当的情况下,实现所有类共有接口的缺省行为;

组合模式

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-21 02:38:51
一、定义 组合模式(Composite):将对象组合成树形结构以表示’部分-整体‘的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 二、优缺点 优点:组合模式可以让客户端一致的使用组合结构和单个对象。当需求是体现部分与整体层次的结构时,以及希望可以忽略组合对象和单个对象的不同,统一使用组合中的所有对象时,就可以用组合模式。 缺点:创建枝节点和子节点都是使用实现类,违背了依赖倒置原则。 三、示例代码 /*所有实现类的共有接口,用于访问和管理子部件*/ public abstract class Component { protected String name; public Component(String name) { this.name = name; } public abstract void add(Component component); public abstract void remove(Component component); public abstract void display(int depth); } /*枝节点*/ public class Composite extends Component { private List<Component> children = new ArrayList<>(); public

模板方法设计模式

梦想的初衷 提交于 2020-01-20 00:41:12
模板方法设计模式 1. 简单介绍 模板方法设计模式是一种结构型设计模式。该模式定义了一个算法的骨架(方法执行的步骤),将算法的各个步骤的具体实现,交由子类完成。模板方法设计模式,让开发者只需要关注算法实现各个细节,而不必关系算法实现的全部流程。 2. 使用场景 具有统一的算法骨架,即方法执行步骤是固定不变的 针对不同的场景,存在多个具有相同操作步骤的应用场景,但部分算法的实现细节有所差异 3. 场景举例 Spring中的事务管理的设计采用了模板方法设计模式。事务的使用步骤可以抽象为:开启事务、相关操作、提交事务。针对上述步骤中的“开启事务”和“提交事务”,可由模板方法进行固定。而具体的“相关操作”,针对不同的子类可以有不同的实现。 4. UML类图 5. 具体实现 描述 背景:活字印刷术,可以根据自己的需求,组合不同的汉字,将组合后的汉字按顺序印刷出自己想要的词组或句子,现假设现有一块印刷版支持三个字的组合,任意组合 AbstractPrintBoard : AbstractClass 角色,表示印刷版,用于用户自由组合三个汉字进行印刷 PrintBoardOne : ConcreteClass 角色,可对“你”、“真”、“好”三个汉字进行组合印刷 PrintBoardTwo : ConcreteClass 角色,可对“你”、“真”、“坏”三个汉字进行组合印刷 实现代码

函数组合的 N 种模式

浪子不回头ぞ 提交于 2020-01-19 16:12:25
随着以函数即服务(Function as a Service)为代表的无服务器计算(Serverless)的广泛使用,很多用户遇到了涉及多个函数的场景,需要组合多个函数来共同完成一个业务目标,这正是微服务“分而治之,合而用之”的精髓所在。本文以阿里云 函数计算 为例,试图全面介绍函数组合的常见模式和使用场景,希望有助于选择合适的解决方案。 虽然本文主要介绍的是函数组合,但是基本思想也可用于服务组合。 函数同步调用函数 在这种模式里,函数直接调用 InvokeFunction 同步 API 执行一个或者多个函数,等待被调用函数返回结果,然后继续执行。这是一个有些争议的模式,不使用同步调用通常有以下原因: 从费用的角度:由于函数计算按照函数实际执行时间收费,调用者在等待被调用函数返回前也会产生一定费用。 执行时长限制:由于函数最长执行10分钟,这就决定了调用的其它函数执行时间之和有限。 从容错的角度:被调用者出错会直接影响调用者,如果这个调用链很长,则这种错误会一直蔓延到最初的调用者,容错性较差。同时由于执行时长限制,调用者通常不容易针对错误做长时间重试。 上面的理由是在有些场景下成立的,但是微服务最经典最常见的组合方式就是同步调用,函数作为微服务的一种实现方式,这种同步调用的需求是不可回避的,在有些场景下采用同步调用模式是值得考虑的,这些场景包括:

设计模式二:结构型模式

对着背影说爱祢 提交于 2020-01-17 09:48:45
一、适配器模式 将一个类的接口转换成客户希望的另一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 角色: 目标接口(Target) 待适配的类(Adaptee) 适配器(Adapter) 两种实现方式 : 类适配器:使用多继承 对象适配器:使用组合 适用场景: 想使用一个已经存在的类,而它的接口不符合你的要求 (对象适配器)想使用一些已经存在的子类,但不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。 # coding : utf-8 # create by ctz on 2017/5/25 from abc import abstractmethod, ABCMeta class Payment(metaclass=ABCMeta): @abstractmethod def pay(self, money): raise NotImplementedError class Alipay(Payment): def pay(self, money): print("支付宝支付%s元"%money) class ApplePay(Payment): def pay(self, money): print("苹果支付%s元"%money) #------待适配类------ class WechatPay: def huaqian

组合模式

末鹿安然 提交于 2020-01-17 07:52:48
组合模式:见名知意,将不同对象组合起来为一个整体使用,组合的好的整体可以继续组合,作为一个新的整体使用。 动机(Motivate): 组合模式有时候又叫做部分 -整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。 代码案例:绘图的时候,有许多基本图形,也有由基本图形组合成的符合图形,如果每次我们复合一张图的时候总是每次都是从基本图形一点点凑成,而不是使用现成的复合图形的话,那代码将是十分糟糕的,组合模式的出现,为我们提供了一个良好的解决方案,他可以将复合图形作为一个我们可使用的'基本图形',由我们进行拼接。 #region 抽象图像类 public abstract class Graphics { protected string _name; public Graphics(string name) { _name = name; } public abstract void Draw(); } #endregion #region 基本图像类 public class Line : Graphics { public Line(string name) : base(name) { } public override void Draw() { Console

组合模式

人盡茶涼 提交于 2020-01-16 22:04:04
组合模式(Composite Pattern) :组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象结构型模式。 组合模式结构图 Component(抽象构件) :它可以是接口或抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等。 Leaf(叶子构件) :它在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过异常等方式进行处理。 Composite(容器构件) :它在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。 代码如下 abstract class Component { public abstract void add ( Component c ) ; //增加成员 public abstract void remove ( Component

python-组合模式

三世轮回 提交于 2020-01-13 22:11:57
源码地址: https://github.com/weilanhanf/PythonDesignPatterns 说明: 组合模式主要用来处理一类具有“容器特征”的对象——它们即充当对象又可以作为容器包含其他多个对象。组合模式对“容器特征”的对象和单个对象一视同仁。例如在计算机处理算术表达式的时候,算术表达式包括操作数,操作符和另一个操作数。操作数可以是一个数字也可以是另一个表达式。这样7+8和(2+3)+(4*6)都是合法的表达式,计算机先将(2+3)+(4*6)分解为(2+3)和(4*6)在对上述两个操作数进行进一步分解。 组合模式也叫作部分-整体模式,其定义如下:将对象组合成树形结构以表示“部分”和“整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 实例: 每一个公司都有自己的组织结构,越是大型的企业,其组织结构就会越复杂。大多数情况下,公司喜欢用“树形”结构来组织复杂的公司人事关系和公司间的结构关系。一般情况下,根结点代表公司的最高行政权利单位,分支节点表示一个个部门,而叶子结点则会用来代表每一个员工。每一个结点的子树,表示该结点代表的部门所管理的单位。假设一个具有HR部门,财务部门和研发部门,同时在全国有分支公司的总公司,其公司结构,可以表示成如下逻辑: class Company: name = '' def __init__(self, name):

18.结构型 - 组合模式 (Composite)

感情迁移 提交于 2020-01-13 05:14:34
1.定义 用树状结构来组合对象,表示整体-部分的层次结构 提供统一的方法来访问对象,忽略对象与对象集合之间的差别 2.UML类图 角色介绍 AbstractComponent : 抽象根节点,定义统一的访问接口 Leaf : 具体叶子节点 Composite : 具体枝干节点 要点 涉及到递归访问 3.UML示例代码 /** * Copyright (C), 2016-2020 * FileName: AbstractComponent * Author: wei.zheng * Date: 2019/11/7 20:42 * Description: 抽象节点: 接口设计 */ public abstract class AbstractComponent { protected String name ; public AbstractComponent ( String name ) { this . name = name ; } public abstract void doSomething ( ) ; public abstract void addChild ( AbstractComponent child ) ; public abstract AbstractComponent getChild ( int index ) ; public abstract