} public function getText() { $str = parent::getText(); $str = mb_convert_kana($str, "RANSKV"); return $str; } } /* * Client */ $text = isset($_POST['text']) ? $_POST['text'] : ''; $decorate = isset($_POST['decorate']) ? $_POST['decorate'] : array(); if ($text !== '') { $text_object = new PlainText(); $text_object->setText($text); //ココに注目!新たに生成されるDecoretorClassが、 //以前のComponentClassやDecoratorクラスを保持するという構成になっている。 foreach ($decorate as $val) { switch ($val) { case 'double': $text_object = new DoubleByteText($text_object); break; case 'upper': $text_object = new UpperCaseText($text_object); break; default: throw new RuntimeException('invalid decorator'); } } echo htmlspecialchars($text_object->getText(), ENT_QUOTES, mb_internal_encoding()) . "<br>";