设计模式 组合模式
目录
一 介绍
又叫做整体-部分模式
属于结构型设计模式。
定义:
将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
主要优点:
1 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象还是组合对象。简化了客户端代码。
2 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”。
适用场景:
描述整体与部分的关系时。
二 示例和代码
比如要统计一个中学的全校学生人数,学校是包括年级的,年级又包括班级,学校--年级--班级 就是整体与部分的关系,我们可以先汇总班级的人数,得到年级的人数,再汇总年级的人数,得到全校总共的人数。
package com.qing.compose;
public interface ICounter {
int count();
}
package com.qing.compose;
public class Classes implements ICounter {
private int sum = 0;
public Classes(int sum) {
this.sum = sum;
}
@Override
public int count() {
return sum;
}
}
package com.qing.compose;
import java.util.ArrayList;
import java.util.List;
public class Container implements ICounter {
private List<ICounter> list = new ArrayList<>();
public void add(ICounter counter) {
list.add(counter);
}
public void remove(ICounter counter) {
list.remove(counter);
}
public List<ICounter> getList() {
return list;
}
@Override
public int count() {
int sum = 0;
for (ICounter counter : list) {
sum += counter.count();
}
return sum;
}
}
测试
package com.qing.compose;
public class Test1 {
public static void main(String[] args) {
Container school = new Container();
//一年级
Container grade1=new Container();
//一年级有2个班级
grade1.add(new Classes(40));
grade1.add(new Classes(50));
//二年级
Container grade2=new Container();
//二年级有2个班级
grade2.add(new Classes(45));
grade2.add(new Classes(43));
//三年级
Container grade3=new Container();
//三年级有3个班级
grade3.add(new Classes(32));
grade3.add(new Classes(30));
grade3.add(new Classes(28));
//学校总共有3个年级
school.add(grade1);
school.add(grade2);
school.add(grade3);
System.out.println(school.count());
}
}
结果