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