Book适配器(类适配器):
//适配器public class BookAdapter extends Book implements Iterable<String>{ @Override public Iterator<String> iterator() { return new IteratorAdapter(getEnum()); }}
那么客户端就能直接使用了,但Book books = new BookAdapter();需改为BookAdapter books = new BookAdapter();也就是不直接访问对象,而访问提供的适配器即可。
18、组合模式(Composite Pattern)
Compose objects into tree structures to represent part-whole hierarchies.Composite lets clients treat individual objects and compositions of objects uniformly.
将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使用户对单个对象和组合对象的使用具有一致性。
何时使用:
当想表示对象的部分-整体层次结构。 希望用户用一致的方式处理个体对象和组合对象。
优点:
组合模式中包含个体对象和组合对象,并形成树形结构,使用户可以方便地处理个体对象和组合对象。 组合对象和个体对象实现了相同的接口,用户一般无须区分个体对象和组合对象。 当增加新的Composite节点和Leaf节点时,用户的重要代码不需要做出修改。
组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念 ,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。组合模式让你可以优化处理递 归或分级数据结构。有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是电脑的文件系统。下面我们就以这个例子来介绍组合模式(虽然我们直接使用Tree这种数据结构也能直接描述)。
一个文件系统中,有目录,目录下有文件和目录
目录和文件的抽象接口(抽象组件):
//抽象组件public intece Component { void addFile(Component file); Component addFolder(Component folder); void removeFile(Component file); void removeFolder(Component folder); List<Component> getFiles(); List<Component> getFolders(); List<Component> getAll(); Iterator<Component> iterator(); void display();}
目录(Composite节点):
public class Folder implements Component { private String name; private List<Component> files; private List<Component> folders; public Folder(String name){ this.name = name; files = new ArrayList<Component>(); folders = new ArrayList<Component>(); } @Override public void addFile(Component file) { files.add(file); } @Override public Component addFolder(Component folder) { folders.add(folder); return this; } @Override public void removeFile(Component file) { files.remove(file); } @Override public void removeFolder(Component folder) { folders.remove(folder); } @Override public List<Component> getFiles() { return files; } @Override public List<Component> getFolders() { return folders; } @Override public List<Component> getAll() { List<Component> all = new ArrayList<Component>(folders); all.addAll(files); return all; } @Override public Iterator<Component> iterator() { List<Component> all = new ArrayList<Component>(); add(all,this); return all.iterator(); } private void add(List<Component> all,Component component){ if(component==null) return; all.add(component); Iterator<Component> iterator = component.getFolders().iterator(); while(iterator.hasNext()){ add(all,iterator.next()); } all.addAll(component.getFiles()); } @Override public void display() { System.out.println(name); }}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33893-36.html
看好你
么么哒小男神
也许是随意惯了