设计模式:Composite模式

设计模式:组合(Composite)模式

一、前言

  关于Composite模式,其实就是组合模式,又叫部分整体模式,这个模式在我们的生活中也经常使用,比如说如果读者有使用Java的GUI编写过程序的,肯定少不了定义一些组件,初始化之后,然后使用容器的add方法,将这些组件有顺序的组织成一个界面出来;或者读者如果编写过前端的页面,肯定使用过<div>等标签定义一些格式,然后格式之间互相组合,通过一种递归的方式组织成相应的结构。这种方式其实就是组合,将部分的组件镶嵌到整体之中。那么凭什么可以这样做呢,需要满足以下两点,首先整体的结构应该是一棵树,第二,所有的组件应该有一个共同的父类(有共同的本质),这个父类使得组件中的共同的本质可以提取出来,进行互融,其实就是父类应该使用add方法,这样子类就可以通过抽象的方式通过父类来表达了,可能有点绕口,让我们看一个例子。

二、代码

Entry 抽象类:共同特质
 1 package zyr.dp.composite;
 2
 3 public abstract class Entry {
 4     public abstract String getName();
 5     public abstract int getSize();
 6     public abstract void printList(String prefix);
 7     public  void printList(){
 8         printList("");
 9     }
10     public  Entry add(Entry entry) throws RuntimeException{
11         throw new RuntimeException();
12     }
13     public  String toString(){
14         return getName()+"<"+getSize()+">";
15     }
16 }

  File 类:实现类,叶子结点

 1 package zyr.dp.composite;
 2
 3 public class File extends Entry {
 4
 5     private String name;
 6     private int size;
 7     public File(String name,int size){
 8         this.name=name;
 9         this.size=size;
10     }
11     public String getName() {
12         return name;
13     }
14
15     public int getSize() {
16         return size;
17     }
18
19     public void printList(String prefix) {
20         System.out.println(prefix+"/"+this);
21     }
22
23 }
Directory 类:可扩充节点(中间节点)
 1 package zyr.dp.composite;
 2
 3 import java.util.ArrayList;
 4 import java.util.Iterator;
 5
 6 public class Directory extends Entry {
 7
 8     String name;
 9     ArrayList entrys=new ArrayList();
10     public Directory(String name){
11         this.name=name;
12     }
13     public String getName() {
14         return name;
15     }
16
17     public int getSize() {
18         int size=0;
19         Iterator it=entrys.iterator();
20         while(it.hasNext()){
21             size+=((Entry)it.next()).getSize();
22         }
23         return size;
24     }
25
26     public Entry add(Entry entry) {
27         entrys.add(entry);
28         return this;
29     }
30
31     public void printList(String prefix) {
32         System.out.println(prefix+"/"+this);
33         Iterator it=entrys.iterator();
34         Entry entry;
35         while(it.hasNext()){
36             entry=(Entry)it.next();
37             entry.printList(prefix+"/"+name);
38         }
39     }
40
41 }

  Main类:组合组件

package zyr.dp.composite;

public class Main {

    public static void main(String[] args) {

        Directory root=new Directory("根目录");

        Directory life=new Directory("我的生活");
        File eat=new File("吃火锅",100);
        File sleep=new File("睡觉",100);
        File study=new File("学习",100);
        life.add(eat);
        life.add(sleep);
        life.add(study);

        Directory work=new Directory("我的工作");
        File write=new File("写博客",200);
        File paper=new File("写论文",200);
        File homework=new File("写家庭作业",200);
        work.add(write);
        work.add(paper);
        work.add(homework);

        Directory relax=new Directory("我的休闲");
        File music=new File("听听音乐",200);
        File walk=new File("出去转转",200);
        relax.add(music);
        relax.add(walk);

        Directory read=new Directory("我的阅读");
        File book=new File("学习书籍",200);
        File novel=new File("娱乐小说",200);
        read.add(book);
        read.add(novel);

        root.add(life);
        root.add(work);
        root.add(relax);
        root.add(read);

        root.printList("D:");
        System.out.println("=================");
        work.printList("work");
        System.out.println("=================");
        novel.printList("novel");

    }

}

 运行结果:

三、总结

  由此可见,我们以前使用的“容器+内容”,其实是通过组合模式实现的,容器里面可以套容器,也可以放内容,但是内容已经是叶子结点了,不能继续扩充,还记得我们在抽象工厂方式中使用的模式之中,为了将零件组装成产品,我们就使用了组合模式,非常的有意思,通过递归来遍历所有的内容。组合模式在我们的生活中使用的非常普遍,我们一定要使用好这个模式,理解其中的抽象,特别是add()的定义,抽象类和实现类之间的参数传递,这点至关重要,当然我们又使用了模板方法和迭代器,希望大家能明白模式之间的联系以及相互使用的道理。

原文地址:https://www.cnblogs.com/zyrblog/p/9237943.html

时间: 2024-10-10 06:24:00

设计模式:Composite模式的相关文章

C++设计模式实现--组合(Composite)模式

一. 举例 这个例子是书上的,假设有一个公司的组结结构如下: 它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点. 而且最关健的是,它的每一层结构很相似. 代码实现如下: #include <iostream> #include <list> #include <string> using namespace std; //公司类,提供接口 class Company { public: Company(string name) { m_nam

设计模式组合模式(Composite)精华

23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助如何创建一个系统独立.这是一个这些对象和陈述的组合. 创建使用继承类的类架构更改实例.的对象类型模型的建立也将委托实例化一个对象. 创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此.创建型模式在什么被创建.谁创建它,它是怎样被创建的,以及何时创建这些方

设计模式 - 组合模式(composite pattern) 详解

组合模式(composite pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 组合模式: 允许你将对象组合成树形结构来表现"整体/部分"层次结构. 组合能让客户以一致的方法处理个别对象以及组合对象. 建立组件类(Component), 组合类(composite)和叶子类(leaf)继承组件类, 客户类(client)直接调用最顶层的组合类(composite)即可. 具体方法: 1. 组件类(component), 包含组合

设计模式 - 组合模式(composite pattern) 迭代器(iterator) 详解

组合模式(composite pattern) 迭代器(iterator) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考组合模式(composite pattern): http://blog.csdn.net/caroline_wendy/article/details/36895627 在组合模式(composite pattern)添加迭代器功能, 遍历每一个组合(composite)的项. 具体方法: 1. 抽象组件类(abstract

Android与设计模式——组合(Composite)模式

定义(GoF<设计模式>):将对象组合成树形结构以表示"部分整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性.  涉及角色 1.Component:(View)是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为.声明一个接口用于访问和管理Component子部件. 2.Leaf:(TextView.自定义View)在组合中表示叶子结点对象,叶子结点没有子结点(即不能在View内再添加View). 3.Composite:(ViewGr

说说设计模式~组合模式(Composite)

返回目录 何时能用到它? 组合模式又叫部分-整体模式,在树型结构中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦.对于今天这个例子来说,它可以很清楚的说明组合模式的用意,首先是一个Graphics对象,它表示是一绘图功能(树根),而circle,line和rectangle分别是简单的图形,它们内部不能再有其它图形了(相当于树叶),而picture是一个复杂图形,它由circle,line和rectangle组成(相当于树

[C++设计模式] composite 组合模式

组合(Composite)模式的其它翻译名称也很多,比如合成模式.树模式等等.在<设计模式>一书中给出的定义是:将对象以树形结构组织起来,以达成"部分-整体"的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. 从定义中可以得到使用组合模式的环境为:在设计中想表示对象的"部分-整体"层次结构:希望用户忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象. 看下组合模式的组成. 1)         抽象构件角色Component:它为组合

Composite模式(组合设计模式)

Composite 设计模式? 在计算机的文件系统中,有"文件夹"的概念(在有些操作系统(Linux操作系统)中,也称为"目录").文件夹里面既可以放入文件,也可以放入其他文件夹(子文件夹).在子文件夹中,一样地既可以放入文件,也可以放入子文件夹.可以说,文件夹是形成了一种容器结构.递归结构. 结构模式:能够使容器与内容具有一致性,创造出递归结构的模式就是Composite模式. 关注点:使用Composite模式可以使容器与内容具有一致性,也可以称其为多个和单个的

二十三种设计模式之:组合(Composite)模式(部分&#183;整体模式)

组合(Composite)模式又叫部分·整体模式,主要用于实现树形结构. 例子如下: public class TreeNode{ private TreeNode parent; private String name; private List<TreeNode> children = new Arraylist<TreeNode>(); public TreeNode(String name){ this.name = name; } public String getNam