-
组合:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
-
使用场景:将多个对象组合在一起进行操作,常用于表示树形结构中,例如二叉树等
注解:当前组合结构的示意图如下:一个🌲型图
代码:
//获取书籍的浏览量和销售量
public interface Statistics {
int getBrowseCount(); /
int getSalesCount();
}
//计算机类书籍
public class ComputerBookStatistics implements Statistics {
@Override
public int getBrowseCount() {
int browseCount = 0;
List<String> allComputerBooks = getAllComputerBooks();
for (String computerBook : allComputerBooks) {
browseCount += getBrowseCount(computerBook);
}
return browseCount;
}
@Override
public int getSalesCount() {
int saleCount = 0;
List<String> allComputerBooks = getAllComputerBooks();
for (String computerBook : allComputerBooks) {
saleCount += getSaleCount(computerBook);
}
return saleCount;
}
}
//医学类书籍
public class MedicalBookStatistics implements Statistics {
@Override
public int getBrowseCount() {
int browseCount = 0;
List<String> allMedicalBooks = getAllMedicalBooks();
for (String medicalBook : allMedicalBooks) {
browseCount += getBrowseCount(medicalBook);
}
return browseCount;
}
@Override
public int getSalesCount() {
int saleCount = 0;
List<String> allMedicalBooks = getAllMedicalBooks();
for (String medicalBook : allMedicalBooks) {
saleCount += getSaleCount(medicalBook);
}
return saleCount;
}
}
问题:获取科技类书籍的销售量,浏览量?
public class TechnicalStatistics implements Statistics {
private List<Statistics> statistics = new ArrayList<Statistics>();
public TechnicalStatistics() {
statistics.add(new ComputerBookStatistics());
statistics.add(new MedicalBookStatistics());
}
@Override
public int getBrowseCount() {
int browseCount = 0;
for (Statistics s : statistics) {
browseCount += s.getBrowseCount();
}
return browseCount;
}
@Override
public int getSalesCount() {
int saleCount = 0;
for (Statistics s : statistics) {
saleCount += s.getBrowseCount();
}
return saleCount;
}
}
问题:统计所有书籍的浏览量和销售量的办法?
public class AllStatistics implements Statistics {
private List<Statistics> statistics = new ArrayList<Statistics>();
public AllStatistics() {
statistics.add(new NovelStatistics());
statistics.add(new TechnicalStatistics());
}
@Override
public int getBrowseCount() {
int browseCount = 0;
for (Statistics s : statistics) {
browseCount += s.getBrowseCount();
}
return browseCount;
}
@Override
public int getSalesCount() {
int saleCount = 0;
for (Statistics s : statistics) {
saleCount += s.getBrowseCount();
}
return saleCount;
}
}
使用:
new TechnicalStatistics().getBrowseCount(); //获取科技类书籍浏览量
new AllStatistics().getSalesCount(); //获取所有书籍的总销量
。。。。