Java proste dema: Dekorator

W języku HTML każdy fragment tekstu może być na różne sposoby „otagowany”, czyli otoczony odpowiednimi znacznikami. Przedstawiony niżej program pozwala użytkownikowi na wprowadzenie jednolinijkowego tekstu, a potem pozwala na dowolne i wielokrotne „otagowanie” go znacznikami em, strong, mark. Program wykorzystuje wzorzec Dekorator. Java 14 z powodu wykorzystania -> w instrukcji switch.

import java.util.Scanner;

abstract class HTMLTag {
    abstract public String getTag();
}

class PlainText extends HTMLTag {
    public PlainText(String text) {
        this.text = text;
    }
    public String getTag() {
        return text;
    }
    private String text;
}

class HTMLDecorator extends HTMLTag {
    public HTMLDecorator(HTMLTag tagToDecorate) {
        decorated = tagToDecorate;
    }
    public String getTag()
    {
        return decorated.getTag();
    }
    private HTMLTag decorated;
}

class EmDecorator extends HTMLDecorator {
    public EmDecorator(HTMLTag tagToDecorate) {
        super(tagToDecorate);
    }
    public String getTag() {
        return "<em>" + super.getTag() + "</em>";
    }
}

class StrongDecorator extends HTMLDecorator {
    public StrongDecorator(HTMLTag tagToDecorate) {
        super(tagToDecorate);
    }
    public String getTag() {
        return "<strong>" + super.getTag() + "</strong>";
    }
}

class MarkDecorator extends HTMLDecorator {
    public MarkDecorator(HTMLTag tagToDecorate) {
        super(tagToDecorate);
    }
    public String getTag() {
        return "<mark>" + super.getTag() + "</mark>";
    }
}

public class Main
{
    public static void main(String[] args) {
        char userChoice;

        print("Podaj tekst: ");
        HTMLTag tag = new PlainText(input.nextLine());
        do {
            print("\nWybierz czym otagowac:");
            print("\n1. em\n2. strong\n3. mark\n0. Koniec\n>> ");
            userChoice = readChar();
            switch(userChoice) {
                case '1' -> tag = new EmDecorator(tag);
                case '2' -> tag = new StrongDecorator(tag);
                case '3' -> tag = new MarkDecorator(tag);
            }
            print(tag.getTag());
        } while(userChoice != '0');
    }
    static void print(String s) {
        System.out.print(s);
    }
    static char readChar() {
        String line = input.nextLine();
        return line.isEmpty() ? ' ' : line.charAt(0);
    }
    static Scanner input = new Scanner(System.in);	
}