| @@ -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