Composite模式(组合模式)

标签: Composite模式 设计模式
3人阅读 评论(0) 收藏 举报
分类:

Composite模式:能够使容器内容具有一致性,创造出递归结构(文件夹与文件)(递归)

示例:列出文件与文件夹的一览

Entry 抽象类:(Component)

public abstract class Entry {
    public abstract String getName();                               // 获取名字
    public abstract int getSize();                                  // 获取大小
    public Entry add(Entry entry) throws FileTreatmentException {   // 加入目录条目
        throw new FileTreatmentException();
    }
    public void printList() {                                       // 为一览加上前缀并显示目录条目一览
        printList("");
    }
    protected abstract void printList(String prefix);               // 为一览加上前缀
    public String toString() {                                      // 显示代表类的文字
        return getName() + " (" + getSize() + ")";
    }
}

File类:(leaf)

public class File extends Entry {
    private String name;
    private int size;
    public File(String name, int size) {
        this.name = name;
        this.size = size;
    }
    public String getName() {
        return name;
    }
    public int getSize() {
        return size;
    }
    protected void printList(String prefix) {
        System.out.println(prefix + "/" + this);
    }

}

Directory类:(composite)

import java.util.Iterator;
import java.util.ArrayList;
public class Directory extends Entry {
    private String name;                    // 文件夹的名字
    private ArrayList directory = new ArrayList();      // 文件夹中目录条目的集合
    public Directory(String name) {         // 构造函数
        this.name = name;
    }
    public String getName() {               // 获取名字
        return name;
    }
    public int getSize() {                  // 获取大小
        int size = 0;
        Iterator it = directory.iterator();
        while (it.hasNext()) {
            Entry entry = (Entry)it.next();
            size += entry.getSize();
        }
        return size;
    }
    public Entry add(Entry entry) {         // 增加目录条目
        directory.add(entry);
        return this;
    }
    protected void printList(String prefix) {       // 显示目录条目一览
        System.out.println(prefix + "/" + this);
        Iterator it = directory.iterator();
        while (it.hasNext()) {
            Entry entry = (Entry)it.next();
            entry.printList(prefix + "/" + name);
        }
    }

}

FileTreatmentException 类:

public class FileTreatmentException extends RuntimeException {
    public FileTreatmentException() {
    }
    public FileTreatmentException(String msg) {
        super(msg);
    }

}

Main类:

public class Main {
    public static void main(String[] args) {
        try {
            System.out.println("Making root entries...");
            Directory rootdir = new Directory("root");
            Directory bindir = new Directory("bin");
            Directory tmpdir = new Directory("tmp");
            Directory usrdir = new Directory("usr");
            rootdir.add(bindir);
            rootdir.add(tmpdir);
            rootdir.add(usrdir);
            bindir.add(new File("vi", 10000));
            bindir.add(new File("latex", 20000));
            rootdir.printList();


            System.out.println("");
            System.out.println("Making user entries...");
            Directory yuki = new Directory("yuki");
            Directory hanako = new Directory("hanako");
            Directory tomura = new Directory("tomura");
            usrdir.add(yuki);
            usrdir.add(hanako);
            usrdir.add(tomura);
            yuki.add(new File("diary.html", 100));
            yuki.add(new File("Composite.java", 200));
            hanako.add(new File("memo.tex", 300));
            tomura.add(new File("game.doc", 400));
            tomura.add(new File("junk.mail", 500));
            rootdir.printList();
        } catch (FileTreatmentException e) {
            e.printStackTrace();
        }
    }

}

Leaf表示“内容”,在该角色中不能放入其他对象
Composite表示容器的角色,可以在其中放入Leaf和Composite角色
Component使Leaf角色和Composite角色具有一致性

查看评论

组合模式(Composite Pattern)(一):组合模式介绍

一、意图 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。 二、适用性 • 你想表示对象的...
  • jialinqiang
  • jialinqiang
  • 2013-05-20 22:30:49
  • 3794

组合模式(Composite Pattern )

当我想去了解组合模式的时候,网上搜一下,有很多优秀的文章,但很多人都在直接给出了组合模式的UML图,然后就去讲解什么是组合,组合有什么优缺点。 我承认他们也许讲的很好,但我并没有一下子就能理解了组合...
  • caiwenfeng_for_23
  • caiwenfeng_for_23
  • 2012-12-31 15:08:56
  • 8362

设计模式:组合模式(COMPOSITE)|菜鸟教程

定义组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模...
  • lory17
  • lory17
  • 2017-03-17 22:41:33
  • 500

浅谈JAVA设计模式之——组合模式(Composite)

一、概述 将对象组合成树形结构以表示"部分-整体"的层次结构。"Composite使得用户对单个对象和组合对象的使用具有一致性。 二、适用性 1.你想表示对象的部分-整体层次结构。 2.你希望用户忽略...
  • l1028386804
  • l1028386804
  • 2015-05-03 12:44:22
  • 2165

[设计模式]_[中级]_[组合模式(Composite)分析与总结]

序: 组合模式在实际开发中实在是使用的很频繁,很实用. 抽象场景: 1. 你想表示对象的部分-整体层次结构.[原书] -- 如果想对某些对象打包统一处理时,比如用std::vector. 2. ...
  • infoworld
  • infoworld
  • 2015-09-13 23:43:07
  • 1554

Java设计模式——组合模式(Composite Pattern)

场景一 描述:大家在上学的时候应该都学过“数据结构”这门课程吧,还记得其中有一节叫“二叉树”吧,我们上学那会儿这一章节是必考内容,左子树,右子树,什么先序遍历后序遍历什么,重点就是二叉树的的遍历,我...
  • u012401711
  • u012401711
  • 2016-09-26 23:42:10
  • 1159

大话设计模式—组合模式

组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,...
  • lmb55
  • lmb55
  • 2016-04-01 22:07:35
  • 2397

Python设计模式——组合模式

组合模式(Composite Pattern)可用来统合类体系中的这两种对象,一种对象能够包含体系中的其他对象,另一种为基本的单元对象,并不能包含其他对象。...
  • qingyunianer
  • qingyunianer
  • 2015-03-11 09:28:33
  • 431

设计模式总结之Composite Pattern(组合模式)

组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。...
  • cooldragon
  • cooldragon
  • 2016-08-11 00:49:14
  • 1511
    个人资料
    等级:
    访问量: 1601
    积分: 278
    排名: 28万+
    文章存档