组合模式用于部分-整体的情况,如树状结构或文件目录式的结构,属于对象包含对象,适用于客户不需要关心整体组合对象和单个对象的不同,统一使用组合结构中的所有对象。通常组合对象持有一个子节点对象集合,且真正实现了操作集合的方法,子节点则不需要真正实现操作集合的方法,比如公司内部,公司老总管若干部门,每个部门老大管若干小组,每个小组组长管若干组员,老大发个通知,通知各个部门老大,再通知各个小组长,再通知各自组员。
示例:
public class Combination {
public static void main(String[] args){
Combination combination=new Combination();
Man man=combination.new Man("");
Man normalMan = combination.new Man("正常");
Boy xiaoMing = combination.new Boy("小明");
Boy xiaoLi = combination.new Boy("小李");
Boy xiaoZhang = combination.new Boy("小张");
normalMan.add(xiaoMing);
normalMan.add(xiaoLi);
normalMan.add(xiaoZhang);
Man unNormalMan = combination.new Man("不正常");
Boy xiaoHuang = combination.new Boy("小黄");
unNormalMan.add(xiaoHuang);
man.add(normalMan);
man.add(unNormalMan);
man.notify();
}
interface Person{
void notify();
void add(Person person);
}
class Man implements Person{
private String type;
public Man(String type) {
this.type = type;
}
private List<Person> personList = new ArrayList<>();
@Override
public void notify() {
System.out.println(type+"男人收到通知");
for(Person p:personList){
p.notify();
}
}
@Override
public void add(Person person) {
personList.add(person);
}
}
class Boy implements Person{
private String name;
public Boy(String name) {
this.name = name;
}
@Override
public void notify() {
System.out.println("小男孩 "+name+" ,收到通知");
}
@Override
public void add(Person person) {
}
}
}
网友评论