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

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


    関連記事

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

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

    【Java】ArrayListの最長文字列を取得する簡単な方法

    (追記)2020/08/19 1. Listが空の場合(NoSuchElementException)に対応しました。 2. Nullが含まれていた場合、空文字として扱うように修正しました。 Arra …

    【Java入門】判定処理(if, if else, switch文)の使い方まとめ

    概要 判定処理には、if / if-else / switch文があります。 これらはとても基本的な判定処理ですが、基本的な使い方に加えて、ちょっとした構文上のTipsや注意点についても解説していきま …

    Javaで数値(int)を部分一致判定する

    文字列に変換して判定します。 <方法> ・matchesメソッドで正規表現使う。 ・containsメソッドに判定文字を渡す。 また、メソッドに切り出すと、intを変換する処理を個別に書かなくてよくな …

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

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

    SpringFramworkの良書

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

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