デコレータパターンは、オブジェクトに新しい機能を動的に追加するための構造的デザインパターンです。このパターンでは、元のオブジェクトをラップ(包む)する新しいオブジェクトを作成し、そのオブジェクトに追加の機能を持たせます。これにより、クラスの継承を使わずに機能を拡張することができます。
まず、基本となるクラスを作成しましょう。この例では、シンプルなテキストメッセージを表示するクラスを定義します。
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())
Text
クラスのインスタンスを作成し、シンプルなテキストをセットします。UppercaseDecorator
を使って、テキストを大文字に変換します。PrefixDecorator
を使って、変換されたテキストにプレフィックスを追加します。get_content
メソッドを呼び出して、装飾されたテキストを表示します。実行すると、次のような出力が得られます。
Greeting: HELLO WORLD
デコレータパターンは、オブジェクトに新しい機能を動的に追加するための強力な手法です。このパターンを使用すると、クラスの継承を避けつつ、機能を拡張することができます。デコレータを組み合わせることで、さまざまな機能を持つオブジェクトを簡単に作成できます。