Decorator パターン

デザインパターンちゃんと勉強をしようと思ったので結城さんの本を 1 つ 1 つ実装してみる。 前回の Compositeからの続き。

Decorator パターンの方針は、既存のオブジェクトを新しい Decorator オブジェクトでラップすることである。 その方法として、Decorator のコンストラクタの引数でラップ対象の Component オブジェクトを読み込み、コンストラクタの内部でそのオブジェクトをメンバに設定することが一般的である。

玉ねぎのような、マトリョーシカのようなパターン。

クラス図

Decorator PlantUML

自分としての理解・疑問

  • 中身と飾り枠(追加する機能)を同一視して扱って、被せるように作っていく。
  • Wikipedia の解説で継承は言語側で実装しているけど、Decorator パターンはプログラム時に同じような機能を持たせる事ができるという説明も見方を変えて面白かった。
  • ここでは Display で規定している透過性がどれだけ保つ事ができる内容なのかによって変わるのかなと思った。

一番実際に利用するときの状況を見る方が早いと思う ↓

<?php
$border = new SideBorder(
    new FullBorder(
        new FullBorder(
            new SideBorder(
                new FullBorder(
                    new StringDisplay("Hello, Border.")
                ),
                '*'
            )
        )
    ),
    '/'
);

デザインパターン関係ないけど

phpunit とかで良く見る[actual]と[expected]を逆にしてた。テストを書く側も逆にしていたから気がつかなかった。別にテストするにあたって問題はないけど、恥ずかしいぃぃぃ :weary: 自分はこういうの多そう。気をつけないと。

<?php
public function test()
{
    $expected = 15; // 期待される値
    $actual = TestClass::testMethod(); // テストした実際の値

    $this->assertEquals($expected, $actual);

}

参考