# Decorator
## Feladat html szöveg
Feladat egy html objektum forrássá alakítása osztályokkal. Származtatással
a sima szövegből több szöveg is specializálódik vastag, dőlt, aláhúzott.
Megnézzük öröklődéssel, majd utána tartalmazással (dekorátor minta használatával)
Deklarálj egy `TextSource` interfészt az `isahasa` csomagban, melyben csak egy metódus van: `String getPlainText()`.
Hozz létre egy `HtmlText` osztályt az `isahasa` csomagban, ami implementálja a `TextSource`
interfészt.
Egy `plainText` attribútumban tárolja a kívánt szöveget, melyet a konstruktorban kap meg.
* a `getPlainText()` ebben az esetben csak visszaadja a tárolt szöveget.
Hozz létre egy `Channel` interfészt, ami csak egy metódust tartalmaz: `int writeByte(byte[] bytes)`
Szükség van még egy kliens osztályra, amely kap egy `TextSource`-ot és ráírja a csatornára a tartalmát.
* A csatornáját egy attribútumban tárolja.
* Konstruktorban megkapja a csatorna referenciát, amit eltárol az attribútumban.
* definiál egy publikus `writeToChannel` metódust, ami megkap egy `TextSource` referenciát. A paraméter
tartalmát lekéri a `getPlainText` metódussal, amit átalakít byte tömbbé (`String` osztálynak van ilyen metódusa), és ezzel hívja a
csatorna `writeByte` metódusát.
## Első megoldás származtatással
A `BoldHtmlText` a vastagon szedett szöveget megvalósító osztály az `isa` csomagban van, és a
`HtmlText`-ből származik.
* a konstruktorban megkapott szöveget a `super`-nek adjuk át, így inicializáljuk.
* a `getPlainText` `` és `` közzé fogja az ősben definiált `getPlainText` eredményét.
A `ItalicHtmlText` a dőlten szedett szöveget megvalósító osztály az `isa` csomagban van, és a
`HtmlText`-ből származik.
* a konstruktorban megkapott szöveget a `super`-nek adjuk át.
* a `getPlainText` `` és `` közzé fogja az ősben definiált `getPlainText` eredményét.
A `UnderlinedHtmlText` az aláhúzott szöveget megvalósító osztály az `isa` csomagban van, és a
`HtmlText`-ből származik.
* a konstruktorban megkapott szöveget a `super`-nek adjuk át.
* a `getPlainText` `` és `` közzé fogja az ősben definiált `getPlainText` eredményét.
A `ItalicAndBoldHtmlText` a vastag betűt megvalósító osztály az `isa` csomagban van, és a
`HtmlText`-ből származik.
* a konstruktorban megkapott szöveget a `super`-nek adjuk át.
* a `getPlainText` `` és `` közzé fogja az ősben definiált `getPlainText` eredményét.
Vegyük észre, hogy minden variációra külön osztály kell (pl.: vastagbetűs és aláhúzott és dőlt).
## Második megoldás származtatással
Most oldjuk meg ezt a feladatot tartalmazással, a dekorátor minta segítségével.
Hozzunk létre egy `TextDecorator` abstract osztályt (a `hasa` csomagban), amely implementálja a konkrét dekorátoroknak
a tartalmazás kapcsolatot.
* A `TextSource` interfészt implementálja. (az előírt metódust nem definiálja
felül, ezért is lesz absztrakt)
* egy védett attribútuba van: `TextSource textSource`
`Bold` osztály (ami egy konkrét dekorátor a `hasa` csomagban) a `TextDecorator` osztályból származik.
* definiál egy konstruktort, amely megkap egy `TextDecorator` referenciát, amire beállítja az örökölt `textSource` attribútumot.
* implementálja az őstől kapott `getPlainText` metódust úgy, hogy a tartalmazott `textSource` referenciája meghívja a `getPlainText`
metódust, és a az értéket közrezárja a `` és `` közzé. (Ez még nagyon hasonló a származás megoldásához.
Különbség az, hogy ott a `super`-en hívtuk meg a `getPlainText` metódusát, itt pedig az attribútumon.)
`Italic` osztály (ami egy konkrét dekorátor a `hasa` csomagban) a `TextDecorator` osztályból származik.
* definiál egy konstruktort, amely megkap egy `TextDecorator` referenciát, amire beállítja az örökölt `textSource` attribútumot.
* implementálja az őstől kapott `getPlainText` metódust úgy, hogy a tartalmazott `textSource` referenciája meghívja a `getPlainText`
metódust, és a az értéket közrezárja a `` és `` közzé.
`Underlined` osztály (ami egy konkrét dekorátor a `hasa` csomagban) a `TextDecorator` osztályból származik.
* definiál egy konstruktort, amely megkap egy `TextDecorator` referenciát, amire beállítja az örökölt `textSource` attribútumot.
* implementálja az őstől kapott `getPlainText` metódust úgy, hogy a tartalmazott textSource referenciája meghívja a `getPlainText`
metódust, és a az értéket közrezárja a `` és `` közzé.
Az előbbi dekorátorok létrehozásának paramétere lehet az alap `HtmlText`, de lehet bármelyik dekorátor is,
hiszen mindegyik implementálja a `TextSource` interfészt. Ezért a dőlt vastagbetűs szöveget a dekorátorok
láncolásásval megoldhatjuk, nem kell új osztály. Ugyanígy a többi variációra sem kell. Az előbbi dekorátorokkal azok
bármilyen kombinációja láncolható.