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