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

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

投稿日:2020年6月9日 更新日:

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タグ
  •  
    最後までお読み頂き、ありがとうございました!
    ご意見・ご要望がありましたら、遠慮なくコメント下さい!
    もし内容が良かったらランキング評価を頂けると励みになります(^^)

    ランキング評価する

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

    執筆者:


    comment

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

    CAPTCHA


    関連記事

    【Java入門】配列の扱い方まとめ

    概要 配列の扱い方について学んでいきましょう。 配列は、同一の型の値を複数持つことができるデータ構造です。 ・int型の配列だったら、int(数値)を複数個持っている。 ・String型の配列だったら …

    pageEncodingとcontentTypeのcharsetの違い

    pageEncodingとcontentTypeのcharsetは処理されるタイミングが異なります。 それによって文字化けの原因につながっているので、どのように設定すればいいかを解説していきます。 違 …

    【Java】TDDして汎用的な部品を作成する(日付期間オブジェクト)

    目的 TDDブートキャンプというセミナーに参加して面白かったので、 自分で何かやってみようと思った。 仕様 日付期間を保持するオブジェクトである。 開始日と終了日を持つ。 開始日と終了日を持つことをど …

    【JdbcTemplate】IN句に値を入れて複数件取得する方法

    JdbcTemplateでIN句に毎回異なる数の値をセットして、 複数のレコードを取得する場合は、「NamedParameterJdbcTemplate」で取得することができます。 コード例 [cra …

    ModelからBindingResultが消える原因と対処方法

    環境 Java(SpringFramework) Thymeleaf 状況 更新画面でバリデーションエラーにより更新が失敗したというようなケースにおいて、 BuindingResultにFormのエラ …

    記事を探す

    SpringFramworkの良書

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

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