diff --git a/composite/pom.xml b/composite/pom.xml new file mode 100644 index 000000000..b94a132cd --- /dev/null +++ b/composite/pom.xml @@ -0,0 +1,23 @@ + + + 4.0.0 + + com.iluwatar + java-design-patterns + 1.0-SNAPSHOT + + com.iluwatar + composite + 1.0-SNAPSHOT + composite + http://maven.apache.org + + + junit + junit + 3.8.1 + test + + + diff --git a/composite/src/main/java/com/iluwatar/App.java b/composite/src/main/java/com/iluwatar/App.java new file mode 100644 index 000000000..49fea34a6 --- /dev/null +++ b/composite/src/main/java/com/iluwatar/App.java @@ -0,0 +1,21 @@ +package com.iluwatar; + +public class App +{ + public static void main( String[] args ) + { + + System.out.println("Message from the orcs: "); + + LetterComposite orcMessage = new Messenger().messageFromOrcs(); + orcMessage.print(); + + System.out.println("\n"); + + System.out.println("Message from the elves: "); + + LetterComposite elfMessage = new Messenger().messageFromElves(); + elfMessage.print(); + + } +} diff --git a/composite/src/main/java/com/iluwatar/Letter.java b/composite/src/main/java/com/iluwatar/Letter.java new file mode 100644 index 000000000..f0a25b6d4 --- /dev/null +++ b/composite/src/main/java/com/iluwatar/Letter.java @@ -0,0 +1,21 @@ +package com.iluwatar; + +public class Letter extends LetterComposite { + + private char c; + + public Letter(char c) { + this.c = c; + } + + @Override + protected void printThisBefore() { + System.out.print(c); + } + + @Override + protected void printThisAfter() { + // nop + } + +} diff --git a/composite/src/main/java/com/iluwatar/LetterComposite.java b/composite/src/main/java/com/iluwatar/LetterComposite.java new file mode 100644 index 000000000..65966195d --- /dev/null +++ b/composite/src/main/java/com/iluwatar/LetterComposite.java @@ -0,0 +1,29 @@ +package com.iluwatar; + +import java.util.ArrayList; +import java.util.List; + +public abstract class LetterComposite { + + private List children = new ArrayList(); + + public void add(LetterComposite letter) { + children.add(letter); + } + + public int count() { + return children.size(); + } + + protected abstract void printThisBefore(); + + protected abstract void printThisAfter(); + + public void print() { + printThisBefore(); + for (LetterComposite letter: children) { + letter.print(); + } + printThisAfter(); + } +} diff --git a/composite/src/main/java/com/iluwatar/Messenger.java b/composite/src/main/java/com/iluwatar/Messenger.java new file mode 100644 index 000000000..d87a94b0d --- /dev/null +++ b/composite/src/main/java/com/iluwatar/Messenger.java @@ -0,0 +1,42 @@ +package com.iluwatar; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +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); + + } + +} diff --git a/composite/src/main/java/com/iluwatar/Sentence.java b/composite/src/main/java/com/iluwatar/Sentence.java new file mode 100644 index 000000000..6eb97bc4b --- /dev/null +++ b/composite/src/main/java/com/iluwatar/Sentence.java @@ -0,0 +1,24 @@ +package com.iluwatar; + +import java.util.List; + +public class Sentence extends LetterComposite { + + public Sentence(List words) { + for (Word w: words) { + this.add(w); + } + } + + @Override + protected void printThisBefore() { + // nop + } + + @Override + protected void printThisAfter() { + System.out.print("."); + } + + +} diff --git a/composite/src/main/java/com/iluwatar/Word.java b/composite/src/main/java/com/iluwatar/Word.java new file mode 100644 index 000000000..ef8ea3b6a --- /dev/null +++ b/composite/src/main/java/com/iluwatar/Word.java @@ -0,0 +1,23 @@ +package com.iluwatar; + +import java.util.List; + +public class Word extends LetterComposite { + + public Word(List letters) { + for (Letter l: letters) { + this.add(l); + } + } + + @Override + protected void printThisBefore() { + System.out.print(" "); + } + + @Override + protected void printThisAfter() { + // nop + } + +} diff --git a/pom.xml b/pom.xml index 2deb6ce3a..0a74b8682 100644 --- a/pom.xml +++ b/pom.xml @@ -25,5 +25,6 @@ singleton adapter bridge + composite \ No newline at end of file