デザインパターン Composite プログラミング

CompsiteパターンでHTMLタグを実現するには?

投稿日:

Compositeパターンに応用できそうなものとして、
HTMLタグなんかいいかと思いコーディングしてみました。

 

クラス図

 

説明

Compositeパターンは再帰構造を実現するパターンです。
一方(Child)が終端で、もう一方(Parent)が再帰構造を持つ形になっています。

ParentはHtmlComponentを集約(実装上ではListで保持)しています。
こうすることで、ParentとHtmlComponentが再帰的な関係持つようになります。
 |
 |こんな感じ
 ↓
Parent(HtmlConponent) – Parent(HtmlConponent) – Parent(HtmlConponent) …
└ Child(HtmlConponent)

ParentもChildもHtmlComponentを継承しており、
同じメソッド(create(String indent))で呼び出すことができます。
ただし、振る舞いが若干異なります。

Parentでは再帰構造を実現するために、保持しているHtmlComponent型のリストをIteration(反復処理)します。
IterationされたHtmlComponentの要素は、ParentまたはChildを呼び出す再帰処理になります。
ChildではParentの反復処理が無いだけで、通常の処理が行われます。

 

ソースコード

HtmlComponent (abstract Class)

ParantとChildの基底クラス(継承元クラス)
create(String indent)は、ParentとChildで実装するメソッドで、
create()はデフォルト動作を実現するメソッドとして実装する。

インデントの指定なし(create())で呼び出すか、
インデントの指定あり(create(String indent))で呼び出すかということになる。

あと、タグと閉じタグはParentとChildで同じであるため、
基底クラスであるこのクラスで実装しておけばよい。

Parent (Class)

create(String indent)メソッドでタグを生成するが、
その際に引数で渡されたインデントを設定する。

また、タグと閉じタグの間に再帰処理を実装することで、
下層のタグを再帰的に作成することになる。

これがCompositeパターンの要点である、
「保持している抽象的な要素を再帰処理する」部分となる。

Child (Class)

Childは下層を持たないため、create(String indent)メソッドは単純に結果を返すのみとなる。

Main (実行)

 

実行結果

追加した各要素の構造でインデントが付与されて表示される。
削除したheaderは表示されていない。

 

参考

Interfaceで実装する例が書かれている。
Wiki – Composite パターン

抽象クラスで実装する方法が書かれている。
デフォルトメソッドの実装もここを参考にしました。
Qiita – デザインパターン ~Composite~

言わずと知れたデザインパターンの良書(全23パターンが網羅されている)
書籍 – 増補改訂版 Java言語で学ぶデザインパターン入門

 

Github

  • 勘定科目のサンプル
  • ファイルシステム
  • HTMLタグ
  •  
    最後までお読み頂き、ありがとうございました!
    ご意見・ご要望がありましたら、遠慮なくコメント下さい!
    もし内容が良かったらランキング評価を頂けると励みになります(^^)

    ランキング評価する

    -デザインパターン, Composite, プログラミング
    -,

    執筆者:


    comment

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    CAPTCHA


    関連記事

    【Spring】バリデーション時に、入力値を保持する方法

    登録画面で「登録」ボタンを押した後、 バリデーションで引っ掛かってエラーになっても 入力内容を画面に保持して置く方法についてです。 テンプレートエンジンは、Tymeleafを使用しています。 方法とし …

    【SpringBoot入門】#1~ 開発環境を準備しよう(IDE)

    想定読者 SpringBootを始めて学ぶ方   IDE(Eclipse) IDEにはEclipse以外にもNetBeansやIntelliJがあります。 好みによりますので使いやすいものを …

    【Java】Optionalが処理できないならデフォルト値を返そう

    概要 Optionalはnullである可能性を明示的に返してくれる便利なコンテナ・オブジェクトです。 if(obj == null)… といったことをしなくてよくなったのは素晴らしいことだ …

    【Bootstrap】ログイン画面をデザインしよう!

    概要 【SpringSecurity】#3~ 独自のログイン画面でシンプルな独自のログイン画面を実装しました。 これに、Bootstrapでデザインを施していきます。 Bootstrapのサンプルを基 …

    正規表現で複数の箇所を入れ替える方法

    複数の特定の箇所を入れ替えるテクニックです。 確認環境 Sakuraエディタ 置換方法 ここでは例として、:区切りの前後の文字列を入れ替えてみます。 置換前データ メニュー:AAA メニュー:BBB …

    記事を探す

    SpringFramworkの良書

    ■おすすめ教材
    Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

    ※SpringはJavaのFrameworkの1つです。
    変更のしやすさ、保守性の高さが特徴です。