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

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


    関連記事

    【SpringBoot入門】#10~ 更新機能の実装

    概要 既に登録済みの書籍情報を画面上で編集し、更新する処理を実装します。 更新した内容が反映されていることを確認するところまでを行います。   フロントエンド 更新情報のリクエスト edit.html …

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

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

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

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

    【SpringBoot入門】#8~ 検索機能の実装

    概要 ・検索フォームから条件を指定して検索すると、条件に一致する結果が一覧画面に表示される。 ・検索条件は複合的に指定できることとする。 ・検索結果は適切にフォーマットされることとする。  (日付はy …

    【Java】HashSetの使い方(順序なしSet)

    HashSetの使い方をまとめました。 HashSetに関する使い方のサイトは他にもありますが、 それらのサイトには書かれていないメソッドについても書いてあります。 HashSetの基本情報 ・重複す …

    ■運営者プロフィール
    IT業界10年のエンジニア。
    PHP -> VBA -> Javaと渡り歩いてきて、今はJavaをメインにフリーランスエンジニアとして活躍中!

    [保有資格]
    ・Java SE 11 Gold

    一度はエンジニアを辞めざるを得なかった私が再びエンジニアとして復活した数奇な物語

    SpringFramworkの良書

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

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