适用性
以下情况下适用Composite模式:
1.你想表示对象的部分-整体层次结构
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。(个人理解符合树形结构,必定会有叶子节点,做好方法默认实现,用于调用的时候叶子节点不作操作)
与装饰者模式的区别
个人认为 1.装饰者模式作用于一个对象,而组合模式作用于多个 2.装饰者重点在于一个对象的方法修改拓展,组合模式在于将多个对象当成一个整体,一个方法通用
/**
* 角色(Component)
*/
public abstract class Component {
protected String name;
protected int level;
public Component(String name, int level) {
this.name = name;
this.level = level;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
// 默认实现叶子结点方法
public void add(Component component) {
throw new UnsupportedOperationException("叶子节点无此功能");
}
// 默认实现叶子结点方法
public void remove(Component component) {
throw new UnsupportedOperationException("叶子节点无此功能");
}
public abstract void print();
}
/**
* 角色(Leaf)
*/
public class Department extends Component {
public Department(String name, int level) {
super(name, level);
}
@Override
public void print() {
System.out.println("部门 :" + getName() + " && " + "等级:" + getLevel());
}
}
/**
* 角色(Composite)
*/
public class College extends Component{
private List<Component> componentList;
public College(String name, int level) {
super(name, level);
componentList = new ArrayList<>();
}
@Override
public void add(Component component) {
componentList.add(component);
}
@Override
public void remove(Component component) {
componentList.remove(component);
}
@Override
public void print() {
System.out.println("======部门:" + getName() + " && 等级:" + getLevel() + "======");
for (Component component : componentList) {
component.print();
}
}
}
/**
* 角色(Composite)
*/
public class University extends Component{
private List<Component> componentList;
public University(String name, int level) {
super(name, level);
componentList = new ArrayList<>();
}
@Override
public void add(Component component) {
componentList.add(component);
}
@Override
public void remove(Component component) {
componentList.remove(component);
}
@Override
public void print() {
System.out.println("*********************部门:" + getName() + " && 等级:" + getLevel() + "*********************");
for (Component component : componentList) {
component.print();
}
}
}
测试类
public class Test {
public static void main(String[] args) {
University university1 = new University("天龙大学", 1);
College college1 = new College("美术学院", 2);
College college2 = new College("计算机学院", 2);
College college3 = new College("化工学院", 2);
Department department1 = new Department("教务处", 3);
Department department2 = new Department("党支部", 3);
university1.add(college1);
university1.add(college2);
university1.add(college3);
college1.add(department1);
college1.add(department2);
college2.add(department1);
university1.print();
// college2.print();
}
}
结果
jdk HashMap源码应用
Node为HashMap静态内部类实现Map的Entry内部接口