@@ -135,7 +135,7 @@ public class OrcKing {
 | 
				
			|||||||
Then it is used as follows
 | 
					Then it is used as follows
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```java
 | 
					```java
 | 
				
			||||||
OrcKing king = new OrcKing();
 | 
					var king = new OrcKing();
 | 
				
			||||||
king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle")); // Orc commander handling request "defend castle"
 | 
					king.makeRequest(new Request(RequestType.DEFEND_CASTLE, "defend castle")); // Orc commander handling request "defend castle"
 | 
				
			||||||
king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner")); // Orc officer handling request "torture prisoner"
 | 
					king.makeRequest(new Request(RequestType.TORTURE_PRISONER, "torture prisoner")); // Orc officer handling request "torture prisoner"
 | 
				
			||||||
king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax")); // Orc soldier handling request "collect tax"
 | 
					king.makeRequest(new Request(RequestType.COLLECT_TAX, "collect tax")); // Orc soldier handling request "collect tax"
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,41 +35,56 @@ Taking our sentence example from above. Here we have the base class and differen
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```java
 | 
					```java
 | 
				
			||||||
public abstract class LetterComposite {
 | 
					public abstract class LetterComposite {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private List<LetterComposite> children = new ArrayList<>();
 | 
					  private List<LetterComposite> children = new ArrayList<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public void add(LetterComposite letter) {
 | 
					  public void add(LetterComposite letter) {
 | 
				
			||||||
    children.add(letter);
 | 
					    children.add(letter);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public int count() {
 | 
					  public int count() {
 | 
				
			||||||
    return children.size();
 | 
					    return children.size();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  protected void printThisBefore() {}
 | 
					
 | 
				
			||||||
  protected void printThisAfter() {}
 | 
					  protected void printThisBefore() {
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  protected void printThisAfter() {
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public void print() {
 | 
					  public void print() {
 | 
				
			||||||
    printThisBefore();
 | 
					    printThisBefore();
 | 
				
			||||||
    for (LetterComposite letter : children) {
 | 
					    children.forEach(LetterComposite::print);
 | 
				
			||||||
      letter.print();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    printThisAfter();
 | 
					    printThisAfter();
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class Letter extends LetterComposite {
 | 
					public class Letter extends LetterComposite {
 | 
				
			||||||
  private char c;
 | 
					
 | 
				
			||||||
 | 
					  private char character;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public Letter(char c) {
 | 
					  public Letter(char c) {
 | 
				
			||||||
    this.c = c;
 | 
					    this.character = c;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Override
 | 
					  @Override
 | 
				
			||||||
  protected void printThisBefore() {
 | 
					  protected void printThisBefore() {
 | 
				
			||||||
    System.out.print(c);
 | 
					    System.out.print(character);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class Word extends LetterComposite {
 | 
					public class Word extends LetterComposite {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public Word(List<Letter> letters) {
 | 
					  public Word(List<Letter> letters) {
 | 
				
			||||||
    for (Letter l : letters) {
 | 
					    letters.forEach(this::add);
 | 
				
			||||||
      this.add(l);
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  public Word(char... letters) {
 | 
				
			||||||
 | 
					    for (char letter : letters) {
 | 
				
			||||||
 | 
					      this.add(new Letter(letter));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Override
 | 
					  @Override
 | 
				
			||||||
  protected void printThisBefore() {
 | 
					  protected void printThisBefore() {
 | 
				
			||||||
    System.out.print(" ");
 | 
					    System.out.print(" ");
 | 
				
			||||||
@@ -77,11 +92,11 @@ public class Word extends LetterComposite {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public class Sentence extends LetterComposite {
 | 
					public class Sentence extends LetterComposite {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public Sentence(List<Word> words) {
 | 
					  public Sentence(List<Word> words) {
 | 
				
			||||||
    for (Word w : words) {
 | 
					    words.forEach(this::add);
 | 
				
			||||||
      this.add(w);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  @Override
 | 
					  @Override
 | 
				
			||||||
  protected void printThisAfter() {
 | 
					  protected void printThisAfter() {
 | 
				
			||||||
    System.out.print(".");
 | 
					    System.out.print(".");
 | 
				
			||||||
@@ -93,39 +108,49 @@ Then we have a messenger to carry messages
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
```java
 | 
					```java
 | 
				
			||||||
public class Messenger {
 | 
					public class Messenger {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  LetterComposite messageFromOrcs() {
 | 
					  LetterComposite messageFromOrcs() {
 | 
				
			||||||
    List<Word> words = List.of(
 | 
					
 | 
				
			||||||
            new Word(List.of(new Letter('W'), new Letter('h'), new Letter('e'), new Letter('r'), new Letter('e'))),
 | 
					    var words = List.of(
 | 
				
			||||||
            new Word(List.of(new Letter('t'), new Letter('h'), new Letter('e'), new Letter('r'), new Letter('e'))),
 | 
					        new Word('W', 'h', 'e', 'r', 'e'),
 | 
				
			||||||
            new Word(List.of(new Letter('i'), new Letter('s'))),
 | 
					        new Word('t', 'h', 'e', 'r', 'e'),
 | 
				
			||||||
            new Word(List.of(new Letter('a'))),
 | 
					        new Word('i', 's'),
 | 
				
			||||||
            new Word(List.of(new Letter('w'), new Letter('h'), new Letter('i'), new Letter('p'))),
 | 
					        new Word('a'),
 | 
				
			||||||
            new Word(List.of(new Letter('t'), new Letter('h'), new Letter('e'), new Letter('r'), new Letter('e'))),
 | 
					        new Word('w', 'h', 'i', 'p'),
 | 
				
			||||||
            new Word(List.of(new Letter('i'), new Letter('s'))),
 | 
					        new Word('t', 'h', 'e', 'r', 'e'),
 | 
				
			||||||
            new Word(List.of(new Letter('a'))),
 | 
					        new Word('i', 's'),
 | 
				
			||||||
            new Word(List.of(new Letter('w'), new Letter('a'), new Letter('y'))));
 | 
					        new Word('a'),
 | 
				
			||||||
 | 
					        new Word('w', 'a', 'y')
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return new Sentence(words);
 | 
					    return new Sentence(words);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  LetterComposite messageFromElves() {
 | 
					  LetterComposite messageFromElves() {
 | 
				
			||||||
    List<Word> words = List.of(
 | 
					
 | 
				
			||||||
            new Word(List.of(new Letter('M'), new Letter('u'), new Letter('c'), new Letter('h'))),
 | 
					    var words = List.of(
 | 
				
			||||||
            new Word(List.of(new Letter('w'), new Letter('i'), new Letter('n'), new Letter('d'))),
 | 
					        new Word('M', 'u', 'c', 'h'),
 | 
				
			||||||
            new Word(List.of(new Letter('p'), new Letter('o'), new Letter('u'), new Letter('r'), new Letter('s'))),
 | 
					        new Word('w', 'i', 'n', 'd'),
 | 
				
			||||||
            new Word(List.of(new Letter('f'), new Letter('r'), new Letter('o'), new Letter('m'))),
 | 
					        new Word('p', 'o', 'u', 'r', 's'),
 | 
				
			||||||
            new Word(List.of(new Letter('y'), new Letter('o'), new Letter('u'), new Letter('r'))),
 | 
					        new Word('f', 'r', 'o', 'm'),
 | 
				
			||||||
            new Word(List.of(new Letter('m'), new Letter('o'), new Letter('u'), new Letter('t'), new Letter('h'))));
 | 
					        new Word('y', 'o', 'u', 'r'),
 | 
				
			||||||
 | 
					        new Word('m', 'o', 'u', 't', 'h')
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return new Sentence(words);
 | 
					    return new Sentence(words);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
And then it can be used as
 | 
					And then it can be used as
 | 
				
			||||||
 | 
					
 | 
				
			||||||
```java
 | 
					```java
 | 
				
			||||||
LetterComposite orcMessage = new Messenger().messageFromOrcs();
 | 
					var orcMessage = new Messenger().messageFromOrcs();
 | 
				
			||||||
orcMessage.print(); // Where there is a whip there is a way.
 | 
					orcMessage.print(); // Where there is a whip there is a way.
 | 
				
			||||||
LetterComposite elfMessage = new Messenger().messageFromElves();
 | 
					var elfMessage = new Messenger().messageFromElves();
 | 
				
			||||||
elfMessage.print(); // Much wind pours from your mouth.
 | 
					elfMessage.print(); // Much wind pours from your mouth.
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user