diff --git a/notes/设计模式.md b/notes/设计模式.md
index 1783c170..d8dd6dbb 100644
--- a/notes/设计模式.md
+++ b/notes/设计模式.md
@@ -500,6 +500,10 @@ public class Client {
### 类图
+- Aggregate 是聚合类,其中 createIterator() 方法可以产生一个 Iterator;
+- Iterator 主要定义了 hasNext() 和 next() 方法。
+- Client 组合了 Aggregate,为了迭代遍历 Aggregate,也需要组合 Iterator。
+
### 实现
@@ -794,7 +798,131 @@ public class Client {
### 意图
-将对象组合成树形结构来表示整体-部分层次关系,允许用户以相同的方式处理单独对象和组合对象。
+将对象组合成树形结构来表示“整体/部分”层次关系,允许用户以相同的方式处理单独对象和组合对象。
+
+### 类图
+
+组件(Component)类是组合类(Composite)和叶子类(Leaf)的父类,可以把组合类看成是树的中间节点。
+
+组合对象拥有一个或者多个组件对象,因此组合对象的操作可以委托给组件对象去处理,而组件对象可以是另一个组合对象或者叶子对象。
+
+
+
+### 实现
+
+```java
+public abstract class Component {
+ protected String name;
+
+ public Component(String name) {
+ this.name = name;
+ }
+
+ public void print() {
+ print(0);
+ }
+
+ abstract void print(int level);
+
+ abstract public void add(Component component);
+
+ abstract public void remove(Component component);
+}
+```
+
+```java
+import java.util.ArrayList;
+import java.util.List;
+
+public class Composite extends Component {
+
+ private List child;
+
+ public Composite(String name) {
+ super(name);
+ child = new ArrayList<>();
+ }
+
+ @Override
+ void print(int level) {
+ for (int i = 0; i < level; i++) {
+ System.out.print("--");
+ }
+ System.out.println("Composite:" + name);
+ for (Component component : child) {
+ component.print(level + 1);
+ }
+ }
+
+ @Override
+ public void add(Component component) {
+ child.add(component);
+ }
+
+ @Override
+ public void remove(Component component) {
+ child.remove(component);
+ }
+}
+```
+
+```java
+public class Leaf extends Component {
+ public Leaf(String name) {
+ super(name);
+ }
+
+ @Override
+ void print(int level) {
+ for (int i = 0; i < level; i++) {
+ System.out.print("--");
+ }
+ System.out.println("left:" + name);
+ }
+
+
+ @Override
+ public void add(Component component) {
+ throw new UnsupportedOperationException(); // 牺牲透明性换取单一职责原则,这样就不用考虑是叶子节点还是组合节点
+ }
+
+ @Override
+ public void remove(Component component) {
+ throw new UnsupportedOperationException();
+ }
+}
+```
+
+```java
+public class Client {
+ public static void main(String[] args) {
+ Composite root = new Composite("root");
+ Component node1 = new Leaf("1");
+ Component node2 = new Composite("2");
+ Component node3 = new Leaf("3");
+ root.add(node1);
+ root.add(node2);
+ root.add(node3);
+ Component node21 = new Leaf("21");
+ Component node22 = new Composite("22");
+ node2.add(node21);
+ node2.add(node22);
+ Component node221 = new Leaf("221");
+ node22.add(node221);
+ root.print();
+ }
+}
+```
+
+```html
+Composite:root
+--left:1
+--Composite:2
+----left:21
+----Composite:22
+------left:221
+--left:3
+```
### JDK
diff --git a/pics/3fb5b255-b791-45b6-8754-325c8741855a.png b/pics/3fb5b255-b791-45b6-8754-325c8741855a.png
new file mode 100644
index 00000000..621245d7
Binary files /dev/null and b/pics/3fb5b255-b791-45b6-8754-325c8741855a.png differ