ホームページ バックエンド開発 PHPチュートリアル PHPデコレータパターンの使い方を詳しく解説

PHPデコレータパターンの使い方を詳しく解説

May 17, 2018 am 11:48 AM
php 使用 詳しい説明

今回は、PHPデコレーターモードの使用方法について詳しく説明します。PHPデコレーターモードを使用する際の注意点は何ですか。以下は実際のケースです。見てみましょう。

Decoratorパターンとは

Decoratorパターンは、構造パターンとして、既存の構造に「装飾」を追加するものです。

アダプターパターンは、今のところ、構造に追加されるものは、クラスのインターフェイスを顧客が期待する別のインターフェイスに変換するアダプター クラスです。アダプターを使用すると、互換性のないインターフェイスを持つクラスが適切に連携できるようになります。

デコレーター パターン は、新しい動作を強化し、デコレーターはラッパーとも呼ばれます (アダプターと同様)

一部のデザイン パターンには、別の抽象クラスも継承します。そのようなデザイン パターンは多数あり、デコレーターはその 1 つです。デコレータ パターンを使用する場合

基本的に、他のオブジェクトに影響を与えずに既存のオブジェクトに新しい機能を追加したい場合は、Web サイトのフォーマットを作成するのに苦労した場合は、デコレータ パターンを使用できます。クライアントと主要コンポーネントが完全に機能する場合、クライアントが新しい機能を要求したときに、車輪を再発明してサイトを再作成する必要はありません。たとえば、クライアントが最初に要求した Web サイトを構築したとします。そして、顧客が新たなニーズを持ち、Web サイトにビデオ機能を組み込みたいと考えている場合、元のコンポーネントを書き直す必要はなく、既存のコンポーネントを「装飾」してそこにビデオ機能を追加するだけで済みます。元の機能を維持することもできます。新しい機能を追加することもできます。 一部のプロジェクトは装飾が必要な場合もあれば、装飾したくない場合もあります。開発パターンはほとんどの顧客の要件を満たすことができますが、一部のクライアントは、これらの追加機能を誰もが望んでいるわけではありません。 「顧客化」機能、つまり特定のビジネス向けに提供される機能を提供する デコレーター パターンを使用すると、コア機能を提供するだけでなく、これらのコア機能を顧客が必要とする独自の機能で「装飾」することもできます。単純な装飾の例

ある Web 開発企業は、いくつかの機能強化を加えた基本的な Web サイトを構築することを計画しています。ただし、Web 開発者は、この基本的なプランはほとんどのクライアントで機能しますが、クライアントがそれをさらに強化したい可能性があることを知っています。将来的には、デコレーター モードを使用すると、複数の特定のデコレーターを簡単に追加できるようになり、追加するデコレーターを選択できるため、機能だけでなく、

コンポーネント インターフェイス

のコストも管理できるようになります。コンポーネントの参加はインターフェイスであり、ここでは抽象クラス IComponent です。この抽象クラスには $site 属性が 1 つだけあり、

参加者は特定のコンポーネントと Decorator 参加者抽象クラスのインターフェイスを明確に確立します:

IComponent .php

<?php
abstract class IComponent
{
  protected $site;
  abstract public function getSite();
  abstract public function getPrice();
}
ログイン後にコピー

getSite()getPrice().Componentデコレータ インターフェイス

この例のデコレータ インターフェイスは驚くかもしれませんが、これは抽象クラスであり、別の抽象クラスも拡張しています。このクラスの役割は、コンポーネント インターフェイス (IComponent) を維持することです。これは、IComponent を拡張することで行われます:

Decorator.php

<?php
abstract class Decorator extends IComponent
{
  /*
  任务是维护Component的引用
  继承getSite()和getPrice()
  因为仍然是抽象类,所以不需要实现父类任何一个抽象方法
  */
}
ログイン後にコピー

Decorator クラスの主な役割は、コンポーネント インターフェイスへの参照を維持することです。

すべてのデコレータ パターンの実装では、両方の具象コンポーネントがさらに、基本インターフェイスの

プロパティとメソッド に加えて、コンポーネントとデコレータには追加のプロパティとメソッドがある場合があります。

具体的なコンポーネント

があります。この例では、Web サイト名と基本的な Web サイトの引用を生成する特定のコンポーネントが 1 つだけです:

BasicSite.php

<?php
class BasicSite extends IComponent
{
  public function construct()
  {
    $this->site = "Basic Site";
  }
  public function getSite()
  {
    return $this->site;
  }
  public function getPrice()
  {
    return 1200;
  }
}
ログイン後にコピー
どちらの抽象メソッドも直接代入を使用して実装されていますが、柔軟性は反映されていません の値を変更する方法実際には、デコレータの値を追加して「基本サイト」の値を変更する必要があります。

特定のデコレータ

这个例子中的具体装饰器与具体组件有相同的接口.实际上, 它们是从Decorator抽象类(而不是IComponent类)继承了这个接口. 不过,要记住, Decorator所做的就是继承IComponent接口.

Maintenance.php

<?php
class Maintenance extends Decorator
{
  public function construct(IComponent $siteNow)
  {
    $this->site = $siteNow;
  }
  public function getSite()
  {
    $format = "<br /> Maintenance";
    return $this->site->getSite() . $format;
  }
  public function getPrice()
  {
    return 950 + $this->site->getPrice();
  }
}
ログイン後にコピー

这个装饰器Maintenance在改变了site的值, 还有包装的具体组件价格上还会增加它自己 的价格. 另个两个具体装饰器与Maintenance装饰器也类似

Video.php

<?php
class Video extends Decorator
{
  public function construct(IComponent $siteNow)
  {
    $this->site = $siteNow;
  }
  public function getSite()
  {
    $format = "<br /> Video";
    return $this->site->getSite() . $format;
  }
  public function getPrice()
  {
    return 350 + $this->site->getPrice();
  }
}
ログイン後にコピー

DataBase.php

<?php
class DataBase extends Decorator
{
  public function construct(IComponent $siteNow)
  {
    $this->site = $siteNow;
  }
  public function getSite()
  {
    $format = "<br /> DataBase";
    return $this->site->getSite() . $format;
  }
  public function getPrice()
  {
    return 800 + $this->site->getPrice();
  }
}
ログイン後にコピー

测试这个应用时,可以看到,在基本的价格之上还会增加各个装饰器的价格.另外还能指定装饰器名的格式, 增加了两个空格,使之缩进

装饰器实现中最重要的元素之五就是构造函数, 要为构造函数提供一个组件类型. 由于这里只有一个具体组件, 所有装饰器的实例化都会使用这个组件. 使用多个组件时, 装饰器可以包装应用中的一部分或全部组件, 也可以不包装任何组件.

客户

Client类并不是这个设计模式的一部分, 但是正确使用Client类至关重要.每个装饰器在实例化时"包装"组件, 不过, 首先必须创建一个要包装的对象, 这里是BasicSite类实例

Client.php

<?php
function autoload($class_name)
{
  include $class_name . &#39;.php&#39;;
}
class Client
{
  private $basicSite;
  public function construct()
  {
    $this->basicSite = new BasicSite();
    $this->basicSite = $this->WrapComponent($this->basicSite);
    $siteShow = $this->basicSite->getSite();
    $format = "<br /> <strong>Total= $";
    $price = $this->basicSite->getPrice();
    echo $siteShow . $format . $price . "</strong>";
  }
  private function WrapComponent(IComponent $component)
  {
    $component = new Maintenance($component);
    $component = new Video($component);
    $component = new DataBase($component);
    return $component;
  }
}
$worker = new Client();
ログイン後にコピー

wrapComponent()方法检查传入的BasicSite实例, 以确保参数有正确的数据类型(IComponent), 然后分别实例化3个装饰器, 对该实例对象进行装饰.

Basic Site
  Maintenance
  Video
  DataBase
  Total= $3300

适配器和装饰器模式都有另外一个名字"包装器"(wrapper)".

适配器可以"包装"一个对象, 创建一个与Adaptee兼容的接口, 而无须对它做任何修改.

装饰器也可以"包装"一个组件对象, 这样就能为这个已胡的组件增加职责, 而无须对它做任何修改.

下面的代码展示了Client如何将组件对象($component)包装在装饰器(Maintence)中:

$component = new Maintenance($component);
ログイン後にコピー

类似于"接口", 在计算机编程中用到"包装器"时, 不同的上下文会有不同的用法和含义. 一般来讲, 在设计模式中使用"包装器"是为了处理接口的不兼容, 或者希望为组件增加功能,包装器就表示用来减少不兼容性的策略.

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

PHP基于面向对象实现留言本步骤详解

PHP里氏替换原则实战分析

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

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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 にアップグレードする方法について説明します。

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 は、

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles