/**
* 组合模式
*/
public class Main {
public static void main(String[] args) {
Cat catParent = new Cat("cat0");
Cat catChild1 = new Cat("cat1");
Cat catChild2 = new Cat("cat2");
Cat catChild3 = new Cat("cat3");
Cat catChild4 = new Cat("cat4");
catParent.addChild(catChild1);
catParent.addChild(catChild2);
catChild2.addChild(catChild3);
catChild2.addChild(catChild4);
catParent.getChildren().forEach(cat->{
System.out.println("parent:"+cat);
System.out.println("{");
cat.getChildren().forEach(System.out::println);
System.out.println("}");
});
}
}
import java.util.List;
public abstract class Animal {
private String name;
private String type;
private List<Animal> children;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Animal> getChildren() {
return children;
}
public void setChildren(List<Animal> children) {
this.children = children;
}
public abstract void addChild(Animal animal);
@Override
public String toString() {
return "Animal{" +
"name='" + name + '\'' +
", type='" + type + '\'' +
'}';
}
}
import java.util.ArrayList;
public class Cat extends Animal {
public Cat(String name){
this.setType("cat");
this.setName(name);
this.setChildren(new ArrayList<Animal>());
}
@Override
public void addChild(Animal animal) {
this.getChildren().add(animal);
}
}
问题:
平时我们经常会有一个对象里包含多个对象,然后这多个对象又包含多个对象,这种对象之间以层级树甚至是图的方式进行组织,这种场景应该如何编程。
用法:
比如大家学习时都遇到过部门树这个编程场景,一个部门下有多个子部门,子部门下还有子部门,层级是不固定,点击可以展开,这就是一个典型的组合关系。
如何组织这种层级关系呢,一般在一个对象里面用数据结构存放着,java的集合对象都是可以的。
这个设计模式的精髓在于,每个组合的元素应该都要加入元素、删除元素和遍历元素的接口,这就体现了组合器的各项功能了。
大家可以思考一下上面说的那个例子,点击部门可以展开下级部门,这个应用在网页端就是用JSON对象来存放这个树状组合结构,如果是用AJAX动态获取下级节点呢,那就是用数据库存放了啊,明白了吗,设计模式很灵活的,说白了只是一种思想,需要我们灵活应用。