将对象组合成树形结构以表示“部分-整体”的层次结构。“组合” 使得用户对单个对象和组合对象的使用具有一致性,对于乘积比较复杂的数据结构使用。
组合模式 composite
问题:
Application needs to manipulate a hierarchical collection of “primitive” and “composite” objects. Processing of a primitive object is handled one way, and processing of a composite object is handled differently. Having to query the “type” of each object before attempting to process it is not desirable.
意图:
- Compose objects into tree structures to represent whole-part hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.
- Recursive composition
- “Directories contain entries, each of which could be a directory.”
- 1-to-many “has a” up the “is a” hierarchy.
例:很少用,所以能想到的场景很少,就拿windows的资源管理器来说,就是一个将文件和文件夹组合在一起的组合模式
代码1:定义需要使用的方法,如ls(window应该叫dir才对^_^),并定义一个文件子类
package com.xdnote.DesignPattern.structural.bridge;
public abstract class Prize {
private String name = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract boolean validate();
@Override
public String toString() {
return this.name.equals("")?"哎,什么都没中":"恭喜您中得"+this.name;
}
}
public class File extends Composite{
private String name;
public File(String name){
this.name=name;
}
@Override
public void ls() {
System.out.println(Client.limit+this.name);
}
}
代码二:定义文件夹,加入组合方法
package com.xdnote.DesignPattern.structural.composite;
import java.util.ArrayList;
import java.util.List;
public class Dir extends Composite{
private String name;
private List<Composite> fileList=new ArrayList<Composite>();
public void add(Composite o){
this.fileList.add(o);
}
public Dir(String name){
this.name=name;
}
@Override
public void ls() {
System.out.println(Client.limit+this.name);
Client.limit.append(" ");
if(this.fileList.size()>0){
for(int i=0;i<this.fileList.size();i++){
this.fileList.get(i).ls();
}
}
Client.limit.setLength(Client.limit.length()-3);
}
}
代码三:客户端使用
public static void main(String[] args) {
Dir one = new Dir(“文件夹A“),
two = new Dir("文件夹B"),
thr = new Dir("文件夹C");
File a = new File("文件A"),
b = new File("文件B"),
c = new File("文件C"),
d = new File("文件D"),
e = new File("文件E");
one.add(a);
one.add(two);
one.add(b);
two.add(c);
two.add(d);
two.add(thr);
thr.add(e);
one.ls();
/**
*
*
dir111
a
dir222
c
d
dir333
e
b
*/
}
小结
组合模式 composite
- 使用频率:
低
虽然很简单,但使用非常少,不知道List<Item> 这种算不算呢,哈哈
- 利弊影响:
低
用的太少啦,不评价。
- 小评:
可能做桌面系统开发的会用得多点吧