ホームページ  >  記事  >  バックエンド開発  >  PHP のアダプター パターンについて 1 つの記事で学習します

PHP のアダプター パターンについて 1 つの記事で学習します

青灯夜游
青灯夜游転載
2021-06-29 19:12:473553ブラウズ

前の記事「 PHP のデコレータ モードについての簡単な説明 」では、PHP のデコレータ モードについて紹介しましたが、この記事では、PHP のアダプタ モードについて説明します。

PHP のアダプター パターンについて 1 つの記事で学習します

このモデルには常に古典的な例があり、それがソケットです。そうです。海外から電化製品を購入したり、海外出張に行ったりする場合、電源アダプターが必要になることがよくあります。これは、我が国の電圧標準が 220 ボルトであるのに対し、他の国の標準電圧は 110 ボルトであるためです。そしてこの電源アダプターはアダプターモードの象徴です。オブジェクトが要件を満たしていない場合は、アダプターを追加してください。 !

Gof クラス図と説明

GoF 定義: クラスのインターフェイスを顧客が望む別のインターフェイスに変換します。アダプター パターンを使用すると、インターフェイスに互換性がないために元々連携できなかったクラスが連携できるようになります。

GoF クラス図:

継承

PHP のアダプター パターンについて 1 つの記事で学習します

結合

PHP のアダプター パターンについて 1 つの記事で学習します

コード実装

interface Target{
    function Request() : void;
}

インターフェイス コントラクトを定義します。実装メソッドを持つ通常のクラスでもあります (次の例ではクラスを使用します)

class Adapter implements Target{
    private $adaptee;

    function __constuct($adaptee){
        $this->adaptee = $adaptee;
    }

    function Request() : void {
        $this->adaptee->SpecificRequest();
    }
}

アダプターは、R​​equest() メソッドを実装できるようにこのインターフェイス コントラクトを実装しますが、実際に何を呼び出すかに注意してください。これは、Adaptee クラスのメソッドです

class Adaptee {
    function SpecificRequest() : void{
        echo "I'm China Standard!";
    }
}
  • アダプターには 2 つの形式があります。上記のクラス図が示されています。コードによって実装された結合形式の
  • 継承形式は次のとおりです。 C は多重継承を実装できるため、例として C が使用されていますが、一般的な言語のほとんどはインターフェイスの形式であり、これも実装できますが、この形式を使用するアダプターはあまりありません。 .
  • 実際には、インターフェイス プログラミングにおける一種の考え方は、デコレータによる古い関数のパッケージ化に似ています。ここではそれらを直接置き換えますが、外部呼び出しは同じままです
  • アダプター モードは実際に理解するのが簡単で、コードは本当にこれだけです

もう一度携帯電話工場について話しましょう。今回は私たちのビジネスが本当に成長しました。タイ、シンガポール、インドネシアにも販売されており、とにかくカレーのあるところならどこでも見つかります。カレー色を生み出したという。シェルの変更はすべてがノアの影響によるものではありませんが、長期にわたる研究の結果、異なる色の方が異なる場所でよりよく売れることがわかりました。したがって、Foxconn は、オリジナルの携帯電話ケースの生産ライン (ターゲット) にスプレー アダプター (アダプター) を設置しました。他の色のケースが必要な場合、このアダプターのみが必要で、別の塗料を変更する (アダプター) ので、このスプレーを直接設置し、新しいカラー携帯電話が誕生します。ビジネスを他の国に拡大する場合は、塗料を変更するだけで済みます。時間がかかりすぎる場合は、ノズルも交換します (プリンターの継続的な供給を忘れないでください)

完全なコード:アダプター パターン

https://github.com/zhangyue0503/designpatterns-php/blob/master/05.adapter/source/adapter.php

Example

テキスト メッセージの送信を続けて、いつコンパイルできるか確認してください~~~

誰もが、情報および支払いインターフェイスに接続するときに、これらのプラットフォームによって提供される SDK をよく使用します。特に Composer では SDK をインストールした方が便利ですが、別の大きな問題があり、この人たちが作った SDK は機能は似ていますが、名前が大きく異なります。 !私たちのシステムは常に Alibaba Cloud のサービスを使用してきましたが、今回は、第一にバックアップとして、第二に、セキュリティまたは経済的な目的を達成するために、異なるサービスに応じて異なるインターフェースを使用するために、Jiguang と Baidu Cloud の情報機能を追加する必要があります。外部インターフェイスを統一して、SDK を使用するときに、誰もが使い慣れている Alibaba Cloud インターフェイスと同じように非常に便利にできるようにするにはどうすればよいでしょうか?もちろん、それぞれにアダプターを与えるだけで、インスタンス化する際に別のアダプターを返す外部ファクトリを設定するだけで、アダプター内の実装方法がAlibaba Cloudと同じであればOKです!

SMS 送信クラス図

PHP のアダプター パターンについて 1 つの記事で学習します

完全なソース コード: SMS 送信アダプター メソッド

https: / /github.com/zhangyue0503/designpatterns-php/blob/master/05.adapter/source/adapter-message.php

<?php

class Message{
    public function send(){
        echo "阿里云发送短信!" . PHP_EOL;
    }
    public function push(){
        echo "阿里云发送推送!" . PHP_EOL;
    }
}

class JiguangSDKAdapter extends Message{
    private $message;

    public function __construct($message){
        $this->message = $message;
    }

    public function send(){
        $this->message->send_out_msg();
    }
    public function push(){
        $this->message->push_msg();
    }
}

class JiguangMessage{
    public function send_out_msg(){
        echo "极光发送短信!" . PHP_EOL;
    }
    public function push_msg(){
        echo "极光发送推送!" . PHP_EOL;
    }
}
class BaiduYunSDKAdapter extends Message{
    private $message;

    public function __construct($message){
        $this->message = $message;
    }

    public function send(){
        $this->message->transmission_msg();
    }
    public function push(){
        $this->message->transmission_push();
    }
}
class BaiduYunMessage{
    public function transmission_msg(){
        echo "百度云发送短信!" . PHP_EOL;
    }
    public function transmission_push(){
        echo "百度云发送推送!" . PHP_EOL;
    }
}

$jiguangMessage = new JiguangMessage();
$baiduYunMessage = new BaiduYunMessage();
$message = new Message();

// 原来的老系统发短信,使用阿里云
$message->send();
$message->push();


// 部分模块用极光发吧
$jgAdatper = new JiguangSDKAdapter($jiguangMessage);
$jgAdatper->send();
$jgAdatper->push();

// 部分模块用百度云发吧
$bdAatper = new BaiduYunSDKAdapter($baiduYunMessage);
$bdAatper->send();
$bdAatper->push();

説明:

  • この例では、適応させる必要がある SDK が 2 つあるため、アダプターが 2 つあります。電力コンバーターは 1 つしかないと誰が言ったのでしょうか。魔法の国が 500 ボルトを使用している場合はどうなるでしょうか? したがって、次のようにする方がよいでしょう。追加の電力変換器を持参してください
  • ここでは、Message クラスを継承します。これは、Message クラスが以前に記述されたコードであり、その中にいくつかのパブリック メソッドが含まれている可能性があるため、インターフェイスがありません。コードをリファクタリングするときに抽象インターフェイスを抽出することを検討できますが、ここでは、アダプターがインターフェイスをターゲットにできるだけではないことを示すためだけです。元のオブジェクトと一貫性がある限り、何も継承しなくても大丈夫です。結局のところ、私たちは弱い型付けの言語です。Java に似た強い型の場合でも、継承または実装が必要です (ポリモーフィズム)
  • 結合アダプターは、外部オブジェクトを維持するという点でデコレーターと似ています。元のクラスのメソッドは関数を追加するために使用されますが、アダプターが関数を追加することはほとんどありません。代わりに、
  • Laravel の Filesystem モジュールを直接置き換えます。FilesystemAdapter クラスがあります。 「これ以上言うことはありません。アダプター パターンを使用していることは誰にとっても明らかです。よく勉強してください。
  • クラスを使用したいが、クラスが提供するコンテンツがビジネスに適合しない場合。; または、次の場合他の無関係なクラスや予期しないクラスと連携できるクラスを作成したい場合は、アダプター パターンを試してみるとよいでしょう。

推奨される学習: "PHP ビデオ チュートリアル >>

以上がPHP のアダプター パターンについて 1 つの記事で学習しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。