ホームページ >バックエンド開発 >PHPチュートリアル >デコレータ パターン: デザイン パターンの力を解き放つ

デコレータ パターン: デザイン パターンの力を解き放つ

WBOY
WBOYオリジナル
2023-09-04 21:01:081005ブラウズ

デコレータ パターン: デザイン パターンの力を解き放つ

このシリーズの前半で、このシリーズのファサードとアダプターの設計パターンについて説明しました。 Facade を使用すると大規模なシステムを簡素化し、アダプターを実装することで外部 API やクラスを使用する際の安全性を確保できます。ここで、構造パターンのカテゴリーに分類されるデコレータ デザイン パターンを紹介します。

基本クラスに追加の責任を与えたい場合は、デコレータ パターンを使用できます。このデザイン パターンは、機能をサブクラス化し、機能を拡張し、いくつかの追加の利点をもたらす優れた代替手段です。

###質問######

あなたが混乱していて、機能をサブクラス化することで同じ機能を実現できると考えている場合は、混乱を解消し、デコレータ パターンを好きになるコード例をいくつか紹介します。

電子メールコンテンツの生成を担当するクラスの例を示します。次のコード ブロックでは、ご覧のとおり、このクラスは何も変更せずに電子メール コンテンツを適切に生成します。

リーリー

クリスマスが近づいていることはわかっているので、次のニュースレター電子メ​​ールで読者に挨拶したいとします。そのため、メールの本文に見栄えの良い画像を含むメッセージを追加する必要があります。

これを行うには、メール クラスで直接編集することもできますが、実際にはそうしたくありません。したがって、継承を実装して同じ効果を実現できます。メインの電子メール本文クラスの別のサブクラスを作成します:

リーリー

それでコードを完成させたので、数日後に新年の願いを込めてメールを送りたいと思います。クリスマスと同じアプローチが使えます。

リーリー

すべてがスムーズに進み、問題はありませんでした。さて、これら 2 つの機会 (クリスマスと新年) で訪問者に挨拶するのを忘れたため、基本クラスのコードを一切変更せずに両方の挨拶を 1 つの電子メールで送信したいとします。

あなたの心はすぐに次の疑問でいっぱいになります: サブクラス化と継承はここで役に立ちますか?私はこれを行うことに賛成ですが、これを実現するには余分な/不必要なコードを使用する必要があります。トレイトを使用すると、多重継承と同様のことを実現できます。

###解決######

前のセクションで説明した問題は、デコレータ パターンを実装することで解決できます。

ウィキペディアによると:

Decorator パターン (Wrapper とも呼ばれ、Adapter パターンと共有される別の命名法) は、他のオブジェクトの動作に影響を与えることなく、単一のオブジェクトに動作を静的または動的に追加できる設計パターンです。同じクラス。

前のセクションでは、サブクラスを使用して機能/動作を拡張できることを見てきましたが、複数の機能/動作を追加すると、冗長で複雑になります。ここでデコレータ パターンを使用する必要があります。

###インターフェース######

リーリー

これは、特定のクラスが必要なメソッドを実装する必要があることを確認するために使用される単純なインターフェイスです。

メイン電子メール クラス

リーリー

これは電子メールのデフォルトの本文を生成するメイン クラスで、通常は電子メールの送信に使用します。ただし、必要なのは、特定の状況に基づいて本文の内容を変更することですが、メインの電子メール クラスは変更しないことです。

メインデコレーター

リーリー これはメインのデコレータ クラスで、メインの電子メール クラスへの参照を保持し、必要に応じてその動作を変更します。ここでは、サブデコレータが動作を変更するために実装する必要がある抽象メソッド

loadBody

を定義します。

サブデコレータ

リーリー

ここでは、実際にメインの電子メール クラスの動作変更を実行するメイン デコレータの 2 つのサブクラスを作成しました。

すべてをまとめます

必要な要素をすべて作成しました。私たちがしなければならないのは、コードを使用して楽しむことだけです。

リーリー

ここで、このデコレータ クラスを必要に応じてさまざまな方法で使用します:

リーリー

メインの電子メール クラスを変更せずに、電子メールの本文を変更したことがわかります。

###結論は######

私たちのすべてのアプリケーションには、定期的に何らかの変更や改善が必要です。したがって、この場合、最終的にコードの品質を向上させ、コードのスケーラビリティを高めるデコレータ設計パターンを実装できます。

デコレータ パターンについて説明するために最善を尽くしましたが、他にコメントや質問がある場合は、お気軽に以下のフィードに追加してください。

以上がデコレータ パターン: デザイン パターンの力を解き放つの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。