<一覧に戻る

デコレータパターン

デコレータパターンは、オブジェクトに新しい機能を動的に追加するための構造的デザインパターンです。このパターンでは、元のオブジェクトをラップ(包む)する新しいオブジェクトを作成し、そのオブジェクトに追加の機能を持たせます。これにより、クラスの継承を使わずに機能を拡張することができます。

デコレータパターンの利点

  • 柔軟性: 必要な機能を追加するデコレータを組み合わせることで、オブジェクトの機能を柔軟に変更できます。
  • 単一責任の原則: 各デコレータは特定の機能を持っているため、責任が分散され、コードの可読性が向上します。
  • 動的な機能追加: プログラムの実行時に機能を追加できるため、静的な継承よりも適応性があります。

サンプルコード

まず、基本となるクラスを作成しましょう。この例では、シンプルなテキストメッセージを表示するクラスを定義します。

class Text:
    def __init__(self, content):
        self.content = content

    def get_content(self):
        return self.content

コード解説

  • Textクラスは、テキストコンテンツを持つシンプルなクラスです。
  • __init__メソッドで初期化され、get_contentメソッドで内容を取得します。

次に、デコレータとなるクラスを作成します。例えば、テキストを大文字に変換するデコレータを作成します。

class UppercaseDecorator:
    def __init__(self, text):
        self.text = text

    def get_content(self):
        return self.text.get_content().upper()

コード解説

  • UppercaseDecoratorクラスは、Textクラスのインスタンスを受け取ります。
  • get_contentメソッドでは、元のテキストを取得し、大文字に変換して返します。

次に、別のデコレータを追加してみましょう。ここでは、テキストの前にプレフィックスを追加するデコレータを作成します。

class PrefixDecorator:
    def __init__(self, text, prefix):
        self.text = text
        self.prefix = prefix

    def get_content(self):
        return self.prefix + self.text.get_content()

コード解説

  • PrefixDecoratorクラスは、テキストとプレフィックスを受け取ります。
  • get_contentメソッドでは、プレフィックスを元のテキストの前に追加して返します。

デコレータの使用例

これで、デコレータを使ってテキストの装飾を行う準備が整いました。以下のコードを使って、デコレータを適用してみましょう。

# 基本のテキストを作成
simple_text = Text("hello world")

# 大文字デコレータを適用
uppercase_text = UppercaseDecorator(simple_text)

# プレフィックスデコレータを適用
decorated_text = PrefixDecorator(uppercase_text, "Greeting: ")

# 最終的な内容を取得
print(decorated_text.get_content())

コード解説

  1. Textクラスのインスタンスを作成し、シンプルなテキストをセットします。
  2. UppercaseDecoratorを使って、テキストを大文字に変換します。
  3. PrefixDecoratorを使って、変換されたテキストにプレフィックスを追加します。
  4. 最後に、get_contentメソッドを呼び出して、装飾されたテキストを表示します。

実行すると、次のような出力が得られます。

Greeting: HELLO WORLD

まとめ

デコレータパターンは、オブジェクトに新しい機能を動的に追加するための強力な手法です。このパターンを使用すると、クラスの継承を避けつつ、機能を拡張することができます。デコレータを組み合わせることで、さまざまな機能を持つオブジェクトを簡単に作成できます。

出力結果: