组合模式(Composite),将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
使用时机:需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式了。
组合模式基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。
类图:
根据类图结合公司的例子,将实例代码放出:
//package com.dlut.designpattern.composite;
import java.util.ArrayList;
import java.util.List;
public abstract class Company {
public String name;
public Company(){
}
public Company(String name){
this.name=name;
}
public abstract void add(Company c);
public abstract void remove(Company c);
public abstract void eachChild();
public String toString() {
return "Company [name=" + name + "]";
}
}
class ConcreteCompany extends Company{
List<Company> lists=new ArrayList<Company>();
public ConcreteCompany(){}
public ConcreteCompany(String name) {
super(name);
}
@Override
public void add(Company c) {
lists.add(c);
}
@Override
public void remove(Company c) {
lists.remove(c);
}
@Override
/**
* 注意此处的用法,看不懂的童鞋请仔细分析
*/
public void eachChild() {
System.out.println(this);
for(Company c:lists){
c.eachChild();
}
}
}
class LeafCompany extends Company{
public LeafCompany(){}
public LeafCompany(String name){
super(name);
}
@Override
public void add(Company c) {
}
@Override
public void remove(Company c) {
}
@Override
public void eachChild() {
System.out.println(this);
}
}
测试类:
//package com.dlut.designpattern.composite;
public class Test {
public static void main(String[] args) {
Company root=new ConcreteCompany("总公司");
root.add(new LeafCompany("大连办事处"));
Company bj=new ConcreteCompany("北京分公司");
bj.add(new LeafCompany("朝阳办事处"));
root.add(bj);
root.eachChild();
}
}
先别看答案,仔细想想执行结果。
Company [name=总公司]
Company [name=大连办事处]
Company [name=北京分公司]
Company [name=朝阳办事处]
想想是哪句起了关键作用?是不是for(Company c:lists){c.eachChild();}
这句 ?
参考: