1. 前言:
-
使用场景:
部分、整体场景。比如:树形菜单、文件文件夹的管理 -
优点:
高层模块调用简单,节点自由增加。 -
缺点
当系统业务复杂时,实现组合模式将会非常困难,并非所有组件的业务都是一致的,而对于这将造成不可避免的冗余。比如:root节点需要提供层级缩略图功能,但是子节点并不需要,但是由于使用了组合模式则每个对象都有同样的代码,这导致无谓的浪费。
例子:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
</body>
<script>
class Employee {
constructor(name, dept, sal) {
this.name = name;
this.dept = dept;
this.sal = sal;
this.subordinates = [];
}
add(sub){
this.subordinates.push(sub);
}
}
let CEO = new Employee("boss", "CEO", 30000);
let headSales = new Employee("Robert", "Head Sales", 20000);
let headMarketing = new Employee("Michel", "Head Marketing", 20000);
let clerk1 = new Employee("Laura", "Marketing", 10000);
let clerk2 = new Employee("Bob", "Marketing", 10000);
let salesExecutive1 = new Employee("Richard", "Sales", 10000);
let salesExecutive2 = new Employee("Rob", "Sales", 10000);
CEO.add(headSales);
CEO.add(headMarketing);
headSales.add(salesExecutive1);
headSales.add(salesExecutive2);
headMarketing.add(clerk1);
headMarketing.add(clerk2);
console.log(CEO);
</script>
</html>