From 287e242e831dee38f674489c52803924f6b1e8c1 Mon Sep 17 00:00:00 2001
From: John Webb <john@jtwebb.com>
Date: Tue, 29 Jul 2014 09:44:37 -0500
Subject: [PATCH] Added Composite UML

---
 Structural/Adapter/README.md         |   2 +-
 Structural/Adapter/{ => uml}/uml.png | Bin
 Structural/Adapter/{ => uml}/uml.svg |   0
 Structural/Adapter/{ => uml}/uml.txt |   0
 Structural/Bridge/README.md          |   2 +-
 Structural/Bridge/{ => uml}/uml.png  | Bin
 Structural/Bridge/{ => uml}/uml.svg  |   0
 Structural/Bridge/{ => uml}/uml.txt  |   0
 Structural/Composite/README.md       |   5 ++++-
 Structural/Composite/uml/uml.png     | Bin 0 -> 12315 bytes
 Structural/Composite/uml/uml.svg     |   1 +
 Structural/Composite/uml/uml.txt     |  23 +++++++++++++++++++++++
 12 files changed, 30 insertions(+), 3 deletions(-)
 rename Structural/Adapter/{ => uml}/uml.png (100%)
 rename Structural/Adapter/{ => uml}/uml.svg (100%)
 rename Structural/Adapter/{ => uml}/uml.txt (100%)
 rename Structural/Bridge/{ => uml}/uml.png (100%)
 rename Structural/Bridge/{ => uml}/uml.svg (100%)
 rename Structural/Bridge/{ => uml}/uml.txt (100%)
 create mode 100644 Structural/Composite/uml/uml.png
 create mode 100644 Structural/Composite/uml/uml.svg
 create mode 100644 Structural/Composite/uml/uml.txt

diff --git a/Structural/Adapter/README.md b/Structural/Adapter/README.md
index e168dda..d2390df 100644
--- a/Structural/Adapter/README.md
+++ b/Structural/Adapter/README.md
@@ -11,4 +11,4 @@ To translate one interface for a class into a compatible interface. An adapter a
 
 ## UML Diagram
 
-![Alt Adapter UML Diagram](uml.png)
\ No newline at end of file
+![Alt Adapter UML Diagram](uml/uml.png)
\ No newline at end of file
diff --git a/Structural/Adapter/uml.png b/Structural/Adapter/uml/uml.png
similarity index 100%
rename from Structural/Adapter/uml.png
rename to Structural/Adapter/uml/uml.png
diff --git a/Structural/Adapter/uml.svg b/Structural/Adapter/uml/uml.svg
similarity index 100%
rename from Structural/Adapter/uml.svg
rename to Structural/Adapter/uml/uml.svg
diff --git a/Structural/Adapter/uml.txt b/Structural/Adapter/uml/uml.txt
similarity index 100%
rename from Structural/Adapter/uml.txt
rename to Structural/Adapter/uml/uml.txt
diff --git a/Structural/Bridge/README.md b/Structural/Bridge/README.md
index a318cb6..b4bf4fd 100644
--- a/Structural/Bridge/README.md
+++ b/Structural/Bridge/README.md
@@ -9,4 +9,4 @@ independently. (http://en.wikipedia.org/wiki/Bridge_pattern)
 
 ## UML Diagram
 
-![Alt Bridge UML Diagram](uml.png)
\ No newline at end of file
+![Alt Bridge UML Diagram](uml/uml.png)
\ No newline at end of file
diff --git a/Structural/Bridge/uml.png b/Structural/Bridge/uml/uml.png
similarity index 100%
rename from Structural/Bridge/uml.png
rename to Structural/Bridge/uml/uml.png
diff --git a/Structural/Bridge/uml.svg b/Structural/Bridge/uml/uml.svg
similarity index 100%
rename from Structural/Bridge/uml.svg
rename to Structural/Bridge/uml/uml.svg
diff --git a/Structural/Bridge/uml.txt b/Structural/Bridge/uml/uml.txt
similarity index 100%
rename from Structural/Bridge/uml.txt
rename to Structural/Bridge/uml/uml.txt
diff --git a/Structural/Composite/README.md b/Structural/Composite/README.md
index ae22908..f0ca01c 100755
--- a/Structural/Composite/README.md
+++ b/Structural/Composite/README.md
@@ -2,7 +2,7 @@
 
 # Purpose
 
-To treat a group of objects the same way as a single instance of the object. 
+To treat a group of objects the same way as a single instance of the object.
 
 # Examples
 
@@ -10,3 +10,6 @@ To treat a group of objects the same way as a single instance of the object.
   subsequently runs through all its child elements and calls `render()` on them
 * `Zend_Config`: a tree of configuration options, each one is a `Zend_Config` object itself
 
+## UML Diagram
+
+![Alt Composite UML Diagram](uml/uml.png)
\ No newline at end of file
diff --git a/Structural/Composite/uml/uml.png b/Structural/Composite/uml/uml.png
new file mode 100644
index 0000000000000000000000000000000000000000..e3534467361e12a0c4eb00b49d290ccd748b166f
GIT binary patch
literal 12315
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
UBC?0{{udd^_iszy7=8Kw0N&l%IsgCw

literal 0
HcmV?d00001

diff --git a/Structural/Composite/uml/uml.svg b/Structural/Composite/uml/uml.svg
new file mode 100644
index 0000000..6c1cb5c
--- /dev/null
+++ b/Structural/Composite/uml/uml.svg
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="226pt" style="width:569px;height:226px;" version="1.1" viewBox="0 0 569 226" width="569pt"><defs><filter height="300%" id="f1" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><rect fill="#FEFECE" filter="url(#f1)" height="86.8652" style="stroke: #A80036; stroke-width: 1.5;" width="218" x="6" y="130.5"/><ellipse cx="96.25" cy="146.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M99.2231,152.1431 Q98.6421,152.4419 98.0029,152.5913 Q97.3638,152.7407 96.6582,152.7407 Q94.1514,152.7407 92.8315,151.0889 Q91.5117,149.437 91.5117,146.3159 Q91.5117,143.1865 92.8315,141.5347 Q94.1514,139.8828 96.6582,139.8828 Q97.3638,139.8828 98.0112,140.0322 Q98.6587,140.1816 99.2231,140.4805 L99.2231,143.2031 Q98.5923,142.6221 97.9988,142.3523 Q97.4053,142.0825 96.7744,142.0825 Q95.4297,142.0825 94.7449,143.1492 Q94.0601,144.2158 94.0601,146.3159 Q94.0601,148.4077 94.7449,149.4744 Q95.4297,150.541 96.7744,150.541 Q97.4053,150.541 97.9988,150.2712 Q98.5923,150.0015 99.2231,149.4204 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="29" x="116.75" y="151.0352">Form</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="223" y1="162.5" y2="162.5"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="103" x="12" y="177.1348">protected elements</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="7" x2="223" y1="183.4551" y2="183.4551"/><ellipse cx="17" cy="195.4326" fill="#84BE84" rx="3" ry="3" style="stroke: #038048; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="26" y="198.0898">render($indent = 0)</text><ellipse cx="17" cy="208.3877" fill="#84BE84" rx="3" ry="3" style="stroke: #038048; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="192" x="26" y="211.0449">addElement(FormElement $element)</text><rect fill="#FEFECE" filter="url(#f1)" height="60.9551" style="stroke: #A80036; stroke-width: 1.5;" width="133" x="259.75" y="8.5"/><ellipse cx="286.45" cy="24.5" fill="#A9DCDF" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M286.5633,19.8481 L285.4095,24.9199 L287.7254,24.9199 Z M285.0691,17.6069 L288.0657,17.6069 L291.4109,30 L288.9622,30 L288.1985,26.937 L284.9197,26.937 L284.1727,30 L281.7239,30 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" font-style="italic" lengthAdjust="spacingAndGlyphs" textLength="75" x="303.05" y="29.0352">FormElement</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="260.75" x2="391.75" y1="40.5" y2="40.5"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="260.75" x2="391.75" y1="48.5" y2="48.5"/><ellipse cx="270.75" cy="60.4775" fill="#84BE84" rx="3" ry="3" style="stroke: #038048; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="279.75" y="63.1348">render($indent = 0)</text><rect fill="#FEFECE" filter="url(#f1)" height="60.9551" style="stroke: #A80036; stroke-width: 1.5;" width="133" x="259.75" y="143.5"/><ellipse cx="286.45" cy="159.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M289.4231,165.1431 Q288.8421,165.4419 288.2029,165.5913 Q287.5638,165.7407 286.8582,165.7407 Q284.3514,165.7407 283.0315,164.0889 Q281.7117,162.437 281.7117,159.3159 Q281.7117,156.1865 283.0315,154.5347 Q284.3514,152.8828 286.8582,152.8828 Q287.5638,152.8828 288.2112,153.0322 Q288.8587,153.1816 289.4231,153.4805 L289.4231,156.2031 Q288.7923,155.6221 288.1988,155.3523 Q287.6053,155.0825 286.9744,155.0825 Q285.6297,155.0825 284.9449,156.1492 Q284.2601,157.2158 284.2601,159.3159 Q284.2601,161.4077 284.9449,162.4744 Q285.6297,163.541 286.9744,163.541 Q287.6053,163.541 288.1988,163.2712 Q288.7923,163.0015 289.4231,162.4204 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="75" x="303.05" y="164.0352">InputElement</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="260.75" x2="391.75" y1="175.5" y2="175.5"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="260.75" x2="391.75" y1="183.5" y2="183.5"/><ellipse cx="270.75" cy="195.4775" fill="#84BE84" rx="3" ry="3" style="stroke: #038048; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="279.75" y="198.1348">render($indent = 0)</text><rect fill="#FEFECE" filter="url(#f1)" height="60.9551" style="stroke: #A80036; stroke-width: 1.5;" width="133" x="427.75" y="143.5"/><ellipse cx="455.8" cy="159.5" fill="#ADD1B2" rx="11" ry="11" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M458.7731,165.1431 Q458.1921,165.4419 457.5529,165.5913 Q456.9138,165.7407 456.2082,165.7407 Q453.7014,165.7407 452.3815,164.0889 Q451.0617,162.437 451.0617,159.3159 Q451.0617,156.1865 452.3815,154.5347 Q453.7014,152.8828 456.2082,152.8828 Q456.9138,152.8828 457.5612,153.0322 Q458.2087,153.1816 458.7731,153.4805 L458.7731,156.2031 Q458.1423,155.6221 457.5488,155.3523 Q456.9553,155.0825 456.3244,155.0825 Q454.9797,155.0825 454.2949,156.1492 Q453.6101,157.2158 453.6101,159.3159 Q453.6101,161.4077 454.2949,162.4744 Q454.9797,163.541 456.3244,163.541 Q456.9553,163.541 457.5488,163.2712 Q458.1423,163.0015 458.7731,162.4204 Z "/><text fill="#000000" font-family="sans-serif" font-size="12" lengthAdjust="spacingAndGlyphs" textLength="72" x="472.7" y="164.0352">TextElement</text><line style="stroke: #A80036; stroke-width: 1.5;" x1="428.75" x2="559.75" y1="175.5" y2="175.5"/><line style="stroke: #A80036; stroke-width: 1.5;" x1="428.75" x2="559.75" y1="183.5" y2="183.5"/><ellipse cx="438.75" cy="195.4775" fill="#84BE84" rx="3" ry="3" style="stroke: #038048; stroke-width: 1.0;"/><text fill="#000000" font-family="sans-serif" font-size="11" lengthAdjust="spacingAndGlyphs" textLength="107" x="447.75" y="198.1348">render($indent = 0)</text><path d="M379.09,82.03 C404.261,101.957 433.734,125.2898 456.529,143.3358 " fill="none" style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 7.0,7.0;"/><polygon fill="none" points="374.621,87.419,363.285,69.517,383.311,76.443,374.621,87.419" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M326,89.791 C326,107.727 326,127.3957 326,143.1056 " fill="none" style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 7.0,7.0;"/><polygon fill="none" points="319,89.517,326,69.517,333,89.517,319,89.517" style="stroke: #A80036; stroke-width: 1.0;"/><path d="M262.039,80.317 C236.891,96.168 207.997,114.381 182.514,130.4436 " fill="none" style="stroke: #A80036; stroke-width: 1.0; stroke-dasharray: 7.0,7.0;"/><polygon fill="none" points="258.52,74.26,279.172,69.517,265.986,86.104,258.52,74.26" style="stroke: #A80036; stroke-width: 1.0;"/></g></svg>
\ No newline at end of file
diff --git a/Structural/Composite/uml/uml.txt b/Structural/Composite/uml/uml.txt
new file mode 100644
index 0000000..598a697
--- /dev/null
+++ b/Structural/Composite/uml/uml.txt
@@ -0,0 +1,23 @@
+@startuml
+class Form {
+    protected elements
+    +render($indent = 0)
+    +addElement(FormElement $element)
+}
+
+abstract class FormElement {
+    +render($indent = 0)
+}
+
+class InputElement {
+    +render($indent = 0)
+}
+
+class TextElement {
+    +render($indent = 0)
+}
+
+FormElement <|.. TextElement
+FormElement <|.. InputElement
+FormElement <|.. Form
+@enduml
\ No newline at end of file