composite-----设计模式

来源:互联网 发布:大数据顶尖企业 编辑:程序博客网 时间:2024/05/16 10:25

1.对容器与内容一视同仁。

举例来说在文件系统中,既有文件夹又有文件,Composite设计模式将把文件夹与文件一视同仁,对其的处理没有差别。

2示例:

package com.cn;import java.util.Iterator;import java.util.Vector;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() + ")";}}class File extends Entry {String name;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);}}class Directory extends Entry {private String name;private Vector<Entry> directory = new Vector<Entry>();public Directory(String name) {this.name = name;}public String getName() {return name;}public int getSize() {int size = 0;Iterator<Entry> 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<Entry> it = directory.iterator();while(it.hasNext()) {Entry entry = (Entry)it.next();entry.printList(prefix + "/" + name); }}}class FileTreatmentException extends RuntimeException {private static final long serialVersionUID = 1L;public FileTreatmentException() {}public FileTreatmentException(String msg) {super(msg);}}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 hanakko = new Directory("{hanako");Directory tomura = new Directory("tomura");usrdir.add(yuki);usrdir.add(hanakko);usrdir.add(tomura);yuki.add(new File("diary.html",100));yuki.add(new File("Composite.java",300));hanakko.add(new File("memo.tex",400));tomura.add(new File("game.doc",400));rootdir.printList();Entry file = new File("dd",200).add(tomura);tomura.add(file);} catch (FileTreatmentException e) {e.printStackTrace();}}}
File 与 Directory 都继承Entry类,他们都有

public abstract String getName();

public abstract int getSize();

public Entry add(Entry entry) ;

这几个方法。

在子类中在提供有差别的处理。


原创粉丝点击