Freitag, 16. März 2012

Decorator Pattern (vereinfacht) für TextBox

Einer GWT-TextBox sollen verschiedene Eigenschaften hinzugefügt werden, z.B. "Man darf nur Zahlen eingeben" oder ähnliches. Dazu eignet sich das Decorator-Pattern, das die TextBox um die benötigten Dinge erweitert, sprich: dekoriert.

Da in unserem Framework die TextBox eh einen Wrapper hat, kann dem TextBoxWrapper eine beliebige Anzahl Dokoratoren mitgegeben werden:




public SuggestBoxWrapper(AbstractView view, String id, SuggestOracle oracle, TextBoxDecorator... decorators) {
        this(view, id, oracle);
        for (TextBoxDecorator textBoxDecorator : decorators) {
            textBoxDecorator.attachToWidget(getWidget().getTextBox());
        }
    }


Die Dekoratoren kennen ihren Decoree und registrieren sich bei ihm als KeyPressHandler:


public abstract class TextBoxDecorator implements KeyPressHandler {
    private static final int CH_SPACE = ' ';

    /**
     * Verbindet diesen Decorator mit der TextBox.
     *
     * @param textBox -- die zum Dekorierer gehörende Textbox.
     */
    public void attachToWidget(TextBoxBase textBox) {
        textBox.addKeyPressHandler(this);
    }


Der Dekorator empfängt dann die Events der Textbox und kann dementprechend handeln: 

    @Override
    public void onKeyPress(KeyPressEvent event) {
        char ch = event.getCharCode();
        if (!(Character.isLetterOrDigit(ch) || isControlCode(ch))) {
            event.preventDefault();
        }
    }

Da der Dekorator seinen Decoree (die TextBox) kennt, könnte man natürlich auch den Text beliebig verändern und so komplexe Formatiere implementieren.