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); }