组合模式

设计模式之美学习(八):为何说要多用组合少用继承?如何决定该用组合还是继承?

北慕城南 提交于 2019-12-05 19:11:39
在面向对象编程中,有一条非常经典的设计原则,那就是:组合优于继承,多用组合少用继承。为什么不推荐使用继承?组合相比继承有哪些优势?如何判断该用组合还是继承? 为什么不推荐使用继承? 继承是面向对象的四大特性之一,用来表示类之间的 is-a 关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的可维护性。所以,对于是否应该在项目中使用继承,网上有很多争议。很多人觉得继承是一种反模式,应该尽量少用,甚至不用。为什么会有这样的争议? 假设我们要设计一个关于鸟的类。我们将“鸟类”这样一个抽象的事物概念,定义为一个抽象类 AbstractBird 。所有更细分的鸟,比如麻雀、鸽子、乌鸦等,都继承这个抽象类。 我们知道,大部分鸟都会飞,那我们可不可以在 AbstractBird 抽象类中,定义一个 fly() 方法呢?答案是否定的。尽管大部分鸟都会飞,但也有特例,比如鸵鸟就不会飞。鸵鸟继承具有 fly() 方法的父类,那鸵鸟就具有“飞”这样的行为,这显然不符合我们对现实世界中事物的认识。当然,你可能会说,在鸵鸟这个子类中重写( override ) fly() 方法,让它抛出 UnSupportedMethodException 异常不就可以了吗?具体的代码实现如下所示: public class AbstractBird { //...省略其他属性和方法.

设计模式及各大原则简介

跟風遠走 提交于 2019-12-05 08:37:57
简介 项目开发中发现问题、解决问题这个过程中会出现很多问题,比如重复出现、某个问题的遗留,这些问题的本质就是设计模式。今天记录设计模式的知识点。 内容 在java以及其他的面向对象设计模式中,类与类之间主要有6种关系,他们分别是:依赖、关联、聚合、组合、继承、实现。它们的耦合度依次增强。 依赖关系: 对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖另一个对象的服务时,这两个对象之间主要体现为依赖关系。 关联关系: 分为单向关联和双向关联。在java中,单向关联表现为:类A当中使用了类B,其中类B是作为类A的成员变量。双向关联表现为:类A当中使用了类B作为成员变量;同时类B中也使用了类A作为成员变量。 聚合关系: 是关联关系的一种,耦合度强于关联,他们的代码表现是相同的,仅仅是在语义上有所区别:关联关系的对象间是相互独立的,而聚合关系的对象之间存在着包容关系,他们之间是“整体-个体”的相互关系。 组合关系: 是一种耦合度更强的关联关系。存在组合关系的类表示“整体-部分”的关联关系,“整体”负责“部分”的生命周期,他们之间是共生共死的;并且“部分”单独存在时没有任何意义。 继承: 表示类与类(或者接口与接口)之间的父子关系。 实现: 表示一个类实现一个或多个接口的方法。 设计原则 要点 定义 描述 单一职责原则 不要存在多于一个导致类变更的原因。通俗的说

设计模式之组合模式

旧城冷巷雨未停 提交于 2019-12-04 18:20:24
定义 将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 UML类图 组合模式有两种不同的实现,一种是安全模式的组合模式,叶子节点没有实现树枝节点独有的方法,UML图为: 另一种是透明模式的组合模式,将树枝节点的方法定义在了节点抽象里面,只是子类没有实现: 角色 Component,树枝节点与树叶节点统一抽象,主要是被树枝节点类关联。 Composient,树枝节点类 Leaf,树叶节点类 思考 组合模式主要是通过把树枝节点和树叶节点统一抽象为了一个类,也就是树枝节点的getChildren方法并不关心返回的是树枝还是叶子类对象,返回的是Component。该模式主要是一种反映树状模型的设计。 来源: https://my.oschina.net/u/4101481/blog/3130531

组合模式

别来无恙 提交于 2019-12-04 15:50:46
定义:也叫部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示部分-整体的关系,使用户对单个对象和组合对象具有一致的访问型 优: 1.客户端可以一致的处理单个对象和组合对象,无需关心处理的是单个还是组合,简化了客户端代码 2.加入新对象,不影响原有的代码,满足开闭原则 缺: 1.设计复杂,客户端需花费大量时间理清关系 2.不容易限制容器的构件 3.不容易用继承的方法来增加构建的新功能 结构: 1.抽象构件(component):为树叶构件和树枝构件声明公共接口,并实现他们的默认行为,在透明式的组合模式中抽象构件还声明访问和管理子类的接口,在安全的组合模式中,不声明访问和管理子类的接口,管理工作由树枝构件完成 2.树叶构件(leaf):是组合中叶节点对象,他没有子节点,用于实现抽象构件角色中声明的公共接口 3.树枝构件(composite):是组合中的分支节点对象,它有子节点,他实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件。通常包含Add(),Remove(),GetChild()等方法 模式: 1.透明方式:由于抽象构件声明了所有子类的全部方法,所以客户端无需区别树叶对象和树枝对象,对客户端来说是透明的,但其缺点是:树叶构件本来没有Add(),Remove(),GetChild()等方法,却要实现他们(空实现或抛异常),这样会带来安全性问题 2

设计模式-组合模式

淺唱寂寞╮ 提交于 2019-12-04 15:46:27
一、概念 组合模式关注那些存在叶子构件和容器构件的结构以及它们的组织形式。一般 处理具有“容器”特征的对象 ,它们既可以充当普通对象,有可以作为其它对象的容器,说白了就是像文件夹一样的,可以包含别人但又被别人包含。将这些对象的联系弄成一个树形结构以表示“整体-部分”的结构层次。 二、角色 1.抽象构件Componet 接口或者抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。比如增加、删除、获取子构件等。 2.叶子构件Leaf 叶子节点对象,没有子节点,对于访问子构件的方法可以通过异常等方式处理。 3.容器构件Composite 容器节点对象,包含子节点(可以是叶子构件或者容器构件), 提供一个集合用于存储子节点 ,实现了在抽象构件中定义的行为,包括访问、管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。 4.客户类Client 通过抽象构件接口访问和控制组合构件中的对象。 三、透明组合模式和安全组合模式 组合模式根据抽象构件类的定义形式,分为两种模式 1.透明组合模式 抽象构件类声明了叶子构件和容器构件的所有方法。但叶子构件和容器构件本质上有区别,叶子构件没有下一层对象,所以添加、删除、访问子对象的方法是没有意义的。编译阶段不出错但运行时调用可能出错。 2.安全组合模式 抽象构件只声明容器构件和叶子构件共同需要的方法

设计模式——结构型模式之组合模式(七)

血红的双手。 提交于 2019-12-04 14:31:13
组合模式 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。 个人理解: 1、组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是终点对象(不再包含别的对象),也有可能是非终点对象(其内部还包含其他对象,或叫组对象),我们将对象称为节点,即一个根节点包含许多子节点,这些子节点有的不再包含子节点,而有的仍然包含子节点,以此类推。 2、所谓组合模式,其实说的是对象包含对象的问题,通过组合的方式(在对象内部引用对象)来进行布局,我认为这种组合是区别于继承的,而另一层含义是指树形结构子节点的抽象(将叶子节点与数枝节点抽象为子节点),区别于普通的分别定义叶子节点与数枝节点的方式 介绍 意图: 将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 主要解决: 它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

初学设计模式之组合模式

江枫思渺然 提交于 2019-12-04 02:37:38
组合模式的代码例子 1 #include<iostream> 2 #include<string> 3 #include<list> 4 using namespace std; 5 6 class Component 7 { 8 public: 9 virtual void show(){}; 10 11 }; 12 class leaf:public Component 13 { 14 private: 15 string info; 16 17 public: 18 leaf(string m_info) 19 { 20 info=m_info; 21 }; 22 void show() 23 { 24 cout<<info<<endl; 25 }; 26 27 }; 28 29 class ConcreteComponent:public Component 30 { 31 private: 32 string info; 33 list<Component*>m_list; 34 public: 35 ConcreteComponent(string m_info) 36 { 37 info=m_info; 38 }; 39 void add(Component* m_ComponentPtr) 40 { 41 m_list.push_back(m

组合实体模式

六眼飞鱼酱① 提交于 2019-12-03 13:27:56
组合实体模式 组合实体模式(Composite Entity Pattern)用在 EJB 持久化机制中。一个组合实体是一个 EJB 实体 bean,代表了对象的图解。当更新一个组合实体时,内部依赖对象 beans 会自动更新,因为它们是由 EJB 实体 bean 管理的。以下是组合实体 bean 的参与者。 组合实体(Composite Entity) - 它是主要的实体 bean。它可以是粗粒的,或者可以包含一个粗粒度对象,用于持续生命周期。 粗粒度对象(Coarse-Grained Object) - 该对象包含依赖对象。它有自己的生命周期,也能管理依赖对象的生命周期。 依赖对象(Dependent Object) - 依赖对象是一个持续生命周期依赖于粗粒度对象的对象。 策略(Strategies) - 策略表示如何实现组合实体。 实现 我们将创建作为组合实体的 CompositeEntity 对象。 CoarseGrainedObject 是一个包含依赖对象的类。 CompositeEntityPatternDemo ,我们的演示类使用 Client 类来演示组合实体模式的用法。 步骤 1 创建依赖对象。 DependentObject1.java public class DependentObject1 { private String data ; public

组合模式

我怕爱的太早我们不能终老 提交于 2019-12-03 13:24:38
组合模式 组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的层次结构。 介绍 意图: 将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 主要解决: 它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。 何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。 如何解决: 树枝和叶子实现统一接口,树枝内部组合该接口。 关键代码: 树枝内部组合该接口,并且含有内部属性 List,里面放 Component。 应用实例: 1、算术表达式包括操作数、操作符和另一个操作数,其中,另一个操作符也可以是操作数、操作符和另一个操作数。 2、在 JAVA AWT 和 SWING 中,对于 Button 和 Checkbox 是树叶,Container

组合模式

匿名 (未验证) 提交于 2019-12-03 00:30:01
组合模式(Composite Pattern)组合多个对象形成树形结构以表示具有“整体-部分”关系的层次结构。组合模式对单个对象(即:叶子构件)和组合对象(即:容器构件)的使用具有一致性,组合模式又被称为“整体-部分”(Part-Whole)模式,属于对象结构型模式。 透明组合模式 安全组合模式 透明组合模式包含以下特点: 在 Component 中定义了用于访问和管理子构建的接口,这样做的好处是确保所有的构件类都有相同的接口。 在 Client 看来,Leaf 与 Composite 所提供的接口一致,Client 可以相同地对待所有的对象。 安全组合模式包含以下特点: 在 Component 中不定义任何用于访问和管理子构建的接口,而在 Composite 中声明并实现。 这种做法是安全的,因为不需要向 Leaf 提供这些管理成员对象的接口,对于 Leaf 来说,Client 不可能调用到这些接口。 透明组合模式的缺点是不够安全,因为 Leaf 和 Composite 在本质上是有区别的。Leaf 不可能有下一个层级,因此为其提供 Add()、Remove()、GetChild() 等接口没有意义。这在编译阶段不会出错,但在运行阶段如果调用这些接口可能会出错(如果没有提供相应的异常处理)。 安全组合模式的缺点是不够透明,因为 Leaf 和 Composite 具有不同的接口,且