组合模式

组合模式-Composite(Java实现)

匿名 (未验证) 提交于 2019-12-02 21:53:52
组合模式-Composite Composite模式使得用户对单个对象和组合对象的使用具有一致性. 以<<图解设计模式>>的文件例子来说: 文件夹是文件的组合, 文件 是单个对象, 文件夹 是多个文件的组合. 不过对用户来说, 无论是文件还是文件夹, 他希望使用一个统一的方法来管理他们.这就需要将他们再次抽象出来. 解读一下这个类图就明白了: 1. 文件是一个组件 2. 文件夹也是一个组件 3. 文件夹里有很多组件: Component抽象类 这是文件 文件夹的抽象定义类--组件类 /** * 这里是文件/文件夹 的统一抽象类 "组件类" */ public abstract class Component { /** * parent是父组件的指针, 也就是本例子中的"父级目录" */ protected Component parent; /** * 获取组件名字 */ public abstract String getName(); /** * 获取组件的大小 */ public abstract int getSize(); /** * @implNote 向一个组件中添加一个组件. * @implSpec 组合模式中的叶子(Leaf)节点不可以使用这个方法, 用例子说明的话: * 一个文件不可以添加一个文件或文件夹, 只能是文件夹来添加文件或文件夹 */ public

java设计模式--组合模式

匿名 (未验证) 提交于 2019-12-02 21:45:52
  组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。・   意思就是用树状结构来表示部分和整体,使他们具有一致性,一致性的意思就是都实现了相同的接口,举个例子,一个公司可能有研发部门和销售部门,然后这个公司又有子公司,子公司也有研发和销售部门,不论是总公司的部门还是子公司的部门,他们的职责其实是差不多的,当我们希望总公司的部门的职责复制到子公司时,就可以使用组合模式。我们看以下代码    //公司接口 public interface Company { void add ( Company company ); void remove ( Company company ); //展示树形结构 void display ( int depth ); //不同部门所具有的各自的职责 void duty (); } // 具体公司类 树枝节点 public class ConcreteCompany implements Company { private List < Company > companyList = new ArrayList <>(); private String name ; public ConcreteCompany ( String name ){ this . name = name

设计模式之组合实体模式

跟風遠走 提交于 2019-12-02 19:45:29
一.组合实体模式 定义:对象的组成类似于树型结构,组成了"部分-整体"的结构,组成的最小单元有相似性,在更高层次的抽象上。 结构: 1.Component(抽象组件),为叶子节点和树节点提供统一的抽象。 2.Composite(容器构建),在组合对象中表示节点对象,在叶子节点之外的都是该类型的结点。 3.Leaf(叶子构件),在组合对象中表示叶子节点。 类图为: Component类 import java.util.ArrayList; public abstract class Component { public abstract void Opertion(); //操作 public abstract void Add(Component Child);//添加子节点 public abstract void Remove(int index);//删除节点 public abstract ArrayList<Component> getChild(int index);//获取子节点 } Leaf类 import java.util.ArrayList; public class Leaf extends Component { private String leafName =null; public Leaf(String leafName) { this

组合模式-Composite

我的未来我决定 提交于 2019-12-02 19:44:26
组合模式 是将对象组合成树形结构以表示 “部分-整体” 的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 一、类图结构 组合模式 包含了如下几个角色: Component:是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。 Leaf :在组合中表示叶子结点对象,叶子结点没有子结点。 Composite:定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。 二、示例 考虑一个杀毒软件的例子,杀毒软件在进行杀毒的时候就是使用的组合模式实现的。 用于访问和管理Component子组件 public abstract class AbstractFileComponent { protected String name; protected AbstractFileComponent(String name) { this.name = name; } protected void printDepth(int depth) { for (int i = 0; i < depth; ++i) { System.out.print('-'); } } protected abstract void add

组合模式

前提是你 提交于 2019-12-01 07:18:06
组合模式允许用户将对象组合成树形结构来表现“整体/部分”的层次结构,从而能够以一致的方式处理单个对象以及对象组合。根据这个定义,首先能够想到的就是软件的菜单,一个菜单可以包含菜单项(菜单项是指不再包含其他内容的菜单条目),也可以包含带有其他菜单项的菜单,因此使用组合模式描述菜单就很恰当,我们的需求是针对一个菜单,打印出其包含的所有菜单以及菜单项。 首先,不管是菜单还是菜单项,都应该继承自统一的接口,这里姑且将这个统一的接口称为菜单组件,其定义如下: 1 public abstract class MenuComponent { 2 public void add(MenuComponent menuComponent){ 3 throw new UnsupportedOperationException(); 4 } 5 6 public void remove(MenuComponent menuComponent){ 7 throw new UnsupportedOperationException(); 8 } 9 10 public MenuComponent getChild(int i){ 11 throw new UnsupportedOperationException(); 12 } 13 14 public String getName(){ 15 throw

java常用的设计模式学习笔记

一笑奈何 提交于 2019-11-30 21:02:35
资料来源于GoF 1. 根据目的来分 根据模式是用来完成什么工作来划分,这种方式可分为创建型模式、结构型模式和行为型模式 3 种。 创建型模式:用于描述“怎样创建对象”,它的主要特点是“将对象的创建与使用分离”。GoF 中提供了单例、原型、工厂方法、抽象工厂、建造者等 5 种创建型模式。 结构型模式:用于描述如何将类或对象按某种布局组成更大的结构,GoF 中提供了代理、适配器、桥接、装饰、外观、享元、组合等 7 种结构型模式。 行为型模式:用于描述类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。GoF 中提供了模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器等 11 种行为型模式。 2. 根据作用范围来分 根据模式是主要用于类上还是主要用于对象上来分,这种方式可分为类模式和对象模式两种。 类模式:用于处理类与子类之间的关系,这些关系通过继承来建立,是静态的,在编译时刻便确定下来了。GoF中的工厂方法、(类)适配器、模板方法、解释器属于该模式。 对象模式:用于处理对象之间的关系,这些关系可以通过组合或聚合来实现,在运行时刻是可以变化的,更具动态性。GoF 中除了以上 4 种,其他的都是对象模式。 来源: https://www.cnblogs.com/codecola/p/11640027.html

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

独自空忆成欢 提交于 2019-11-30 17:37:49
组合模式(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

设计模式之组合模式

六月ゝ 毕业季﹏ 提交于 2019-11-29 17:36:59
1、什么是组合模式   组合模式是一种方案,能够让用户可以一致性地处理整个树形结构(容器构件)或树形结构的一部分(叶子构件)。虽然两部分表现出的功能不一样,整体使用上无太大差别。 2、组合模式应用场景   1:在具有整体和部分的层次结构中,希望通过一种方式忽略整体和部分的差异,客户端可以一致性对待处理。   2:处理的是一个树形结构。   3:系统中可以分离出叶子对象和容器对象,而且他们的类型不固定,需要增加一些新的类型。   遍历文件夹进行文件类型、数量、大小的统计。文件夹内可能包含子文件夹(容器文件),也可能只有具体格式的文件,即叶子文件。 3、组合模式示例   首先区分一下透明式组合模式和安全型组合模式   透明式组合模式:     抽象构件中声明了所有用于管理成员对象的方法,确保所有构件类都有相同的接口。在客户端看来叶子构件和容器构件所提供的方法一致的。具体可参考示例   安全型组合模式:     抽象构件中声明构件操作的方法,叶子构件继承方法重写实现具体的操作,而在组合类中声明并实现用于管理成员对象(构件)的方法,这样叶子构件根本看不到管理成员对象的方法,避免在使用中出现异常操作。   透明式组合示例:    AbstractFile --抽象构件类 /** * @Description 抽象构件 * @CreateDate 2019-09-15-21:28 *

《Head First 设计模式》笔记

眉间皱痕 提交于 2019-11-28 20:14:44
第一章 策略模式 00设计原则: 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码放在一起。 把会变化的部分取出并封装起来,好让其它部分不会受到影响。结果如何?代码变化引起的不经意后果变少,系统变得更有弹性。 00设计原则: 针对接口编程,而不是针对实现编程。 “针对接口编程”真正的意思是“针对超类型编程”: 这里的接口有多个含义,接口是一个概念,也是一种java的interface构造。”针对接口编程“关键就在多态。利用多态,程序可以针对超类型编程,执行时会根据实际情况执行到真正的行为,不会被绑死在超类型的行为上。这句话可以更明确的说成”变量的声明类型应该是超类型,通常是一个抽象类或者是一个接口。如此,只要是具体实现此超类型的类所产生的对象,都可以指定给这个变量。这也意味着声明类时不用理会以后执行的真正对象类型。 OO设计原则: 多用组合,少用继承 使用组合建立系统具有很大的弹性,不仅可以将算法族封装成类,更可以“在运行时动态地改变行为”,只要组合的行为对象符合正确的接口标准即可。 策略模式 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 类图 JDK java.util.Comparator#compare() javax.servlet.http.HttpServlet javax.servlet

组合模式12(15)

有些话、适合烂在心里 提交于 2019-11-28 19:31:08
树结构 树:根->树枝->树叶 总公司->分公司->分公司各部门 根节点:总公司->总公司各部门 package structural; import java.util.ArrayList; import java.util.List; public class CompositeMain { public static void main(String[] args) { //根节点,及根节点相关内容 //总公司,及总公司所在部门 HCompany root = new HCompany("大米时代公司"); root.add(new LearnDepartment("总公司研发部门")); root.add(new DisciplineDepartment("总公司考核部门")); //树枝节点 HCompany branchC1 = new HCompany("衡水分公司"); branchC1.add(new LearnDepartment("衡水开发部")); branchC1.add(new DisciplineDepartment("衡水财政综合部门")); root.add(branchC1);//总公司中有分公司 //树枝节点 HCompany branchC2 = new HCompany("天水分公司"); branchC2.add(new