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

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】SetをStreamで処理する方法 7選!

    概要 前回の【Java】ListをStreamで処理する方法 7選!に続き、Set編です。 基本的にListもSetもCollection型であるため、コーディングに大きな差はありません。 気を付ける …

    【SpringBoot入門】#11~ 削除ダイアログの作成

    概要 検索結果から削除機能を呼び出した際に、削除を確認するためのダイアログです。 実装はjQueryで行いますので、mavenへの追加作業等の準備を別途行います。 イメージ jQueryの準備 jQu …

    【Java】画像ファイルをバイナリで比較する方法

      画像ファイルの比較 比較元ファイル 素材はPhotoACから拝借しました。 コピー元画像:PCを持つ女性 コピーしたファイルとの比較(True) コピー元ファイルをコピーしただけのファイ …

    SpringでNotNullなどのバリデーションが効かないときの対処法

    状況 フィールドに入っている値は空文字なのに、 @NotNull, @NotEmpty, @NotBlankでエラーとして検知されない。 (BindingResultでhasErroe=0件となる) …

    no image

    GitでIndexが壊れたときの直し方

    これは自分の環境用の備忘録です。 (状況) Virtual BOX内のGit環境において、INDEXが0KBになっている。(INDEXが壊れている) (対処方法) リモート環境から新しくCloneして …

    SpringFramworkの良書

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

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