From f28ed7b46e5897f53efb20041e92f13a90fb9209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilkka=20Sepp=C3=A4l=C3=A4?= Date: Thu, 31 Aug 2017 22:11:58 +0300 Subject: [PATCH] #590 Add explanation for Composite pattern --- composite/README.md | 114 +++++++++++++++++- composite/etc/composite.png | Bin 16195 -> 0 bytes composite/etc/composite.ucls | 75 ------------ composite/etc/composite.urm.puml | 43 ------- composite/etc/composite_1.png | Bin 33933 -> 0 bytes .../main/java/com/iluwatar/composite/App.java | 4 +- .../java/com/iluwatar/composite/Letter.java | 5 - .../iluwatar/composite/LetterComposite.java | 4 +- .../java/com/iluwatar/composite/Sentence.java | 5 - .../java/com/iluwatar/composite/Word.java | 5 - pom.xml | 1 + 11 files changed, 117 insertions(+), 139 deletions(-) delete mode 100644 composite/etc/composite.png delete mode 100644 composite/etc/composite.ucls delete mode 100644 composite/etc/composite.urm.puml delete mode 100644 composite/etc/composite_1.png diff --git a/composite/README.md b/composite/README.md index fce6ed6af..fbb21ecb3 100644 --- a/composite/README.md +++ b/composite/README.md @@ -16,7 +16,119 @@ Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly. -![alt text](./etc/composite_1.png "Composite") +## Explanation + +Real world example + +> Every sentence is composed of words which are in turn composed of characters. Each of these objects is printable and they can have something printed before or after them like sentence always ends with full stop and word always has space before it + +In plain words + +> Composite pattern lets clients treat the individual objects in a uniform manner. + +Wikipedia says + +> In software engineering, the composite pattern is a partitioning design pattern. The composite pattern describes that a group of objects is to be treated in the same way as a single instance of an object. The intent of a composite is to "compose" objects into tree structures to represent part-whole hierarchies. Implementing the composite pattern lets clients treat individual objects and compositions uniformly. + +**Programmatic Example** + +Taking our sentence example from above. Here we have the base class and different printable types + +``` +public abstract class LetterComposite { + private List children = new ArrayList<>(); + public void add(LetterComposite letter) { + children.add(letter); + } + public int count() { + return children.size(); + } + protected void printThisBefore() {} + protected void printThisAfter() {} + public void print() { + printThisBefore(); + for (LetterComposite letter : children) { + letter.print(); + } + printThisAfter(); + } +} + +public class Letter extends LetterComposite { + private char c; + public Letter(char c) { + this.c = c; + } + @Override + protected void printThisBefore() { + System.out.print(c); + } +} + +public class Word extends LetterComposite { + public Word(List letters) { + for (Letter l : letters) { + this.add(l); + } + } + @Override + protected void printThisBefore() { + System.out.print(" "); + } +} + +public class Sentence extends LetterComposite { + public Sentence(List words) { + for (Word w : words) { + this.add(w); + } + } + @Override + protected void printThisAfter() { + System.out.print("."); + } +} +``` + +Then we have a messenger to carry messages + +``` +public class Messenger { + LetterComposite messageFromOrcs() { + List words = new ArrayList<>(); + words.add(new Word(Arrays.asList(new Letter('W'), new Letter('h'), new Letter('e'), new Letter('r'), new Letter('e')))); + words.add(new Word(Arrays.asList(new Letter('t'), new Letter('h'), new Letter('e'), new Letter('r'), new Letter('e')))); + words.add(new Word(Arrays.asList(new Letter('i'), new Letter('s')))); + words.add(new Word(Arrays.asList(new Letter('a')))); + words.add(new Word(Arrays.asList(new Letter('w'), new Letter('h'), new Letter('i'), new Letter('p')))); + words.add(new Word(Arrays.asList(new Letter('t'), new Letter('h'), new Letter('e'), new Letter('r'), new Letter('e')))); + words.add(new Word(Arrays.asList(new Letter('i'), new Letter('s')))); + words.add(new Word(Arrays.asList(new Letter('a')))); + words.add(new Word(Arrays.asList(new Letter('w'), new Letter('a'), new Letter('y')))); + return new Sentence(words); + } + + LetterComposite messageFromElves() { + List words = new ArrayList<>(); + words.add(new Word(Arrays.asList(new Letter('M'), new Letter('u'), new Letter('c'), new Letter('h')))); + words.add(new Word(Arrays.asList(new Letter('w'), new Letter('i'), new Letter('n'), new Letter('d')))); + words.add(new Word(Arrays.asList(new Letter('p'), new Letter('o'), new Letter('u'), new Letter('r'), new Letter('s')))); + words.add(new Word(Arrays.asList(new Letter('f'), new Letter('r'), new Letter('o'), new Letter('m')))); + words.add(new Word(Arrays.asList(new Letter('y'), new Letter('o'), new Letter('u'), new Letter('r')))); + words.add(new Word(Arrays.asList(new Letter('m'), new Letter('o'), new Letter('u'), new Letter('t'), new Letter('h')))); + return new Sentence(words); + } +} +``` + +And then it can be used as + +``` +LetterComposite orcMessage = new Messenger().messageFromOrcs(); +orcMessage.print(); // Where there is a whip there is a way. +LetterComposite elfMessage = new Messenger().messageFromElves(); +elfMessage.print(); // Much wind pours from your mouth. +``` ## Applicability Use the Composite pattern when diff --git a/composite/etc/composite.png b/composite/etc/composite.png deleted file mode 100644 index 1e6e6258ab696029a676688710bdcec0d95cbcc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16195 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 YN5E9DaLQOh19*g!hAN0xiy8+0KiLYo&Hw-a diff --git a/composite/etc/composite.ucls b/composite/etc/composite.ucls deleted file mode 100644 index 184c452f4..000000000 --- a/composite/etc/composite.ucls +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/composite/etc/composite.urm.puml b/composite/etc/composite.urm.puml deleted file mode 100644 index 82f2cab0d..000000000 --- a/composite/etc/composite.urm.puml +++ /dev/null @@ -1,43 +0,0 @@ -@startuml -package com.iluwatar.composite { - class App { - - LOGGER : Logger {static} - + App() - + main(args : String[]) {static} - } - class Letter { - - c : char - + Letter(c : char) - # printThisAfter() - # printThisBefore() - } - abstract class LetterComposite { - - children : List - + LetterComposite() - + add(letter : LetterComposite) - + count() : int - + print() - # printThisAfter() {abstract} - # printThisBefore() {abstract} - } - class Messenger { - + Messenger() - ~ messageFromElves() : LetterComposite - ~ messageFromOrcs() : LetterComposite - } - class Sentence { - + Sentence(words : List) - # printThisAfter() - # printThisBefore() - } - class Word { - + Word(letters : List) - # printThisAfter() - # printThisBefore() - } -} -LetterComposite --> "-children" LetterComposite -Letter --|> LetterComposite -Sentence --|> LetterComposite -Word --|> LetterComposite -@enduml \ No newline at end of file diff --git a/composite/etc/composite_1.png b/composite/etc/composite_1.png deleted file mode 100644 index 5f5b010dd2fbdfbcce43be338284ab69b1443f7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33933 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%0Aj|yv(XSrL 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 z5p;B_gg18)7!WIprototype adapter bridge + composite