ホームページ バックエンド開発 PHPチュートリアル PHP デザイン パターン デコレーター Pattern_PHP チュートリアル

PHP デザイン パターン デコレーター Pattern_PHP チュートリアル

Jul 21, 2016 pm 03:20 PM
php 優れた 導入 関数 動的 土地 物体 意思 拡大する モデル デザインパターン 責任

のご紹介
Decorator パターンは、オブジェクトに責任を動的に割り当てます。機能を拡張するために、デコレータは継承に代わるより柔軟な手段を提供します。

マインドマップ

装饰者模式

レストランの注文システムを構築するこのようなプロジェクトがあります。初期のコード構造はこんな感じです。以前は Beverage クラスがたくさんありましたが、現在直面している問題は、Milk クラスや SugarAndMilk クラスなど、すべての関連クラスを調整する必要があることです。メソッドを 1 つずつ変更します。これを行うたびに開発者は気が狂います。したがって、既存の構造を変更する必要があります。次の図は単純な図であり、実際の図はそれほど単純ではありません。

デザインの問題:

1》クラスの数が爆発的に増加し、メンテナンスが困難になる;
2》全体のデザインが鈍くなる;
3》基本クラスに追加された新しい機能がサブクラスで使用できない;継承、結合、デリゲートなど、クラス メソッドを再利用するさまざまな方法。なぜいつも継承を使用するのですか? Zend Framework にもこの習慣があるようですね。対応するメソッドを見つけるたびに、上にスクロールし続けます。 ——余談です!!!!
その後、グループリサーチの結果、コーヒーを別のカテゴリーとして抽出することにしました(ミルクコーヒーやスイートコーヒーなど)。個別にクラスにパッケージ化されています。
改良されたデザイン:

詳細な説明

1》ドリンクの場合は、Beverageクラスを直接継承し、引用をドリンククラスに直接書き込みます。
2》調味料を追加する必要がある一部の特別なドリンクの場合は、累積操作を実行します。たとえば、ミルク入りのコーヒーが欲しい場合、合計金額 = コーヒーの価格 + ミルクの価格
3》このようにして、さまざまな飲み物の価格を簡単に知ることができます。
コード

コードをコピー コードは次のとおりです:
abstract class Beverage{
public $_name;
abstract public function Cost()
}
// Decorator クラス
class; Coffee extends Beverage{
public function __construct(){
$this->_name = 'Coffee';
}
public function Cost(){
return 1.00;
}
// 次の 3 つのクラスが関連していますデコレータークラス
class CondimentDecorator extends Beverage{
public function __construct(){
$this->_name = 'Condiment';
}
public function Cost(){
return 0.1;
}
class Milk extends CondimentDecorator{
public $_beverage;
public function __construct($beverage){
$this->_name = 'Milk';
if($beverage instanceof Beverage){
$this->_beverage = $beverage
exit ('失敗');
}
public function Cost(){
return $this->_beverage->Cost() + 0.2;
}
}
class Sugar extends CondimentDecorator{
public $_beverage; function __construct($beverage){
$this->_name = 'Sugar';
if($beverage instanceof Beverage){
$this->_beverage = $beverage{
exit('失敗') ;
}
}
public function Cost(){
return $this->_beverage->Cost() + 0.2;
}
}
// コーヒー 1 杯を入手します
$ Coffee = new Coffee();
$coffee = new Milk($coffee)
//3. 砂糖を追加します
$coffee = new Sugar($coffee);合計:%0.2f 元n",$coffee->Cost());


概要
1. デコレータ (Milk) とデコレータ (Coffee) は同じ型である必要があります。目的は、デコレータがデコレータを置き換える必要があることです。
2. 動作の追加: デコレーターとコンポーネントを組み合わせると、新しい動作が追加されます。
余談:
1. サブクラスの動作を設計するには継承を使用します。これはコンパイル時に静的に決定され、すべてのサブクラスは同じ動作を継承します。たとえば、私はカンフーを学びたいのですが、あなたの息子が太極拳を知っているのを見ると、私はあなたのものを受け継ぐだけでよく、私も太極拳を知ることになります - はは、この時点で私はあなたの息子になるでしょう、そしてどうやら相続が必要だということ。
2. 組み合わせにより、オブジェクトの動作を拡張し、実行時に動的に拡張できます。合成を使用すると、既存のコードを変更することなく、スーパークラスの設計時に思いつかなかったメソッドをいつでもオブジェクトに追加できます。たとえば、私は今内力を持っていませんが、力吸収方法は僧侶、尼僧、道士の内力(行動オブジェクト)を吸収することができ、戦闘中(実行時間)にさまざまな内力を使用できます。いつでも、でも、内部エネルギーをランダムに吸い込まないでください。そうしないと、気が狂ってしまいます。
3. クラスは延長の場合はオープン、変更の場合はクローズする必要があります。デコレータパターンを使って各部分を設計すると、フレームワーク全体としては少し無駄になりますし、コードの難易度も上がります。では、このパターンをいつ使用する必要があるのでしょうか?通常、頻繁に変更される場所で使用します。では、どの場所が頻繁に変更されるかをどのようにして知ることができるのでしょうか?これには、私たちの経験と、お客様が属する業界についての理解が必要です。平時からより多くの例を読むことをお勧めします。
4. 装飾モードはデザインに柔軟性をもたらしますが、同時にデザインに多数の小さなカテゴリを追加するため、他の人がデザインを理解しにくくなることがあります。
5. デコレータ パターンを使用する場合は、挿入されたデコレータに特に注意してください。デコレータ パターンは特定のタイプ (飲料) に依存しているためです。
6. デコレータ パターンをうまく使用するには、ファクトリ パターンとジェネレータ パターンを併用する必要がありますが、今日はデコレータ パターンについてのみ説明します。さらに詳しく知りたい場合は、次の章を聞いてください。
参考:「ヘッドファーストデザインパターン」

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/325090.html技術記事オブジェクトに責任を動的に割り当てる Decorator パターンの導入。機能を拡張するために、デコレータは継承に代わるより柔軟な手段を提供します。 マインドマップ こんなプロジェクトがあるんだ、やってみろ…
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP データベースの操作 CakePHP データベースの操作 Sep 10, 2024 pm 05:25 PM

CakePHP でデータベースを操作するのは非常に簡単です。この章では、CRUD (作成、読み取り、更新、削除) 操作について理解します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

CakePHP のロギング CakePHP のロギング Sep 10, 2024 pm 05:26 PM

CakePHP へのログインは非常に簡単な作業です。使用する関数は 1 つだけです。 cronjob などのバックグラウンド プロセスのエラー、例外、ユーザー アクティビティ、ユーザーが実行したアクションをログに記録できます。 CakePHP でのデータのログ記録は簡単です。 log()関数が提供されています

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

See all articles