From 5f07dd904073618870a284e16bd144501dab38b5 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Mon, 4 Jun 2018 16:04:08 +0800 Subject: [PATCH] auto commit --- notes/设计模式.md | 130 +++++++++++++++++- pics/3fb5b255-b791-45b6-8754-325c8741855a.png | Bin 0 -> 22528 bytes 2 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 pics/3fb5b255-b791-45b6-8754-325c8741855a.png 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 0000000000000000000000000000000000000000..621245d7cfa318c59f1b65ca7c3d11c9e35c8b52 GIT binary patch literal 22528 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 literal 0 HcmV?d00001