アダプターパターンとは何ですか?
アダプター パターンは、オブジェクトのインターフェイスを、別のオブジェクトが予期するインターフェイスに単純に適合させます。
アダプター パターン アプリケーションの問題と解決策
アプリケーションでは、アーキテクチャ的に信頼性が高く安定した実用的なコード ベースを使用できます。しかし、既存のオブジェクトを当初の設計とは異なる方法で使用する必要がある新しい機能を追加することもよくあります。この時点での障害は、単に新しい機能に別の名前が必要であるということかもしれません。より複雑なシナリオでは、新しい機能が元のオブジェクトとはわずかに異なる動作を必要とすることが障害となる場合もあります。
上記の問題に対応して、私たちが採用した解決策は、アダプター パターンを使用して別のオブジェクトを構築することです。このアダプタ オブジェクトは、元のアプリケーションと新しい機能の間の仲介者として機能します。アダプター パターンは、新しいオブジェクトの要件に一致する既存のオブジェクトの新しいインターフェイスを定義します。
質問
Alipay 支払いクラスの関数は次のとおりであると仮定します。
/** * 支付宝支付类 */ class Alipay { public function sendPayment() { echo '使用支付宝支付。'; } } // 客户端代码 $alipay = new Alipay(); $alipay->sendPayment();
支払い関数を完成させるために、Alipay クラスを直接インスタンス化します。 クライアント コードがたくさんある可能性があります。
一定期間後、Alipay の Alipay クラスがアップグレードされ、メソッド名が sendPayment() から goPayment() に変更された場合はどうなりますか?
sendPayment() を使用するすべてのクライアント コードを変更する必要があります。
Alipay クラスが頻繁にアップグレードされる場合、またはクライアントが多くの場所で使用される場合、これは膨大な作業負荷になります。
解決策
今度はアダプターパターンを使用してそれを解決します。
クライアントとAlipayクラスの間に中間クラス、つまりアダプタークラスを追加して、元のAlipayをクライアントが必要とする形式に変換します。
クライアントが統一クラスメソッドを呼び出せるようにするために、まずアダプターインターフェースを定義します:
/** * 适配器接口,所有的支付适配器都需实现这个接口。 * 不管第三方支付实现方式如何,对于客户端来说,都 * 用pay()方法完成支付 */ interface PayAdapter { public function pay(); }
Alipayクラスを制御することができず、頻繁に更新される可能性があるため、変更は行いません。
新しい AlipayAdapter アダプター クラスを作成し、次のように pay() で Alipay の支払い関数を変換します:
/** * 支付宝适配器 */ class AlipayAdapter implements PayAdapter { public function pay() { // 实例化Alipay类,并用Alipay的方法实现支付 $alipay = new Alipay(); $alipay->sendPayment(); } }
クライアントの使用法:
// 客户端代码 $alipay = new AlipayAdapter(); // 用pay()方法实现支付 $alipay->pay();
このように、Alipay の支払い方法が変更された場合、AlipayAdapter クラスを変更するだけで済みます。 。
新しいクラスに適応
アダプターを使用すると、拡張が簡単になります。
上記の例を続けると、Alipay に基づいて、QR コードをスキャンして支払う必要がある点で WeChat 支払いが追加されます。
この場合、WeChat の支払い機能を直接使用するのではなく、アダプターも使用する必要があります。
コードは次のとおりです:
/** * 微信支付类 */ class WechatPay { public function scan() { echo '扫描二维码后,'; } public function doPay() { echo '使用微信支付'; } } /** * 微信支付适配器 */ class WechatPayAdapter implements PayAdapter { public function pay() { // 实例化WechatPay类,并用WechatPay的方法实现支付。 // 注意,微信支付的方式和支付宝的支付方式不一样,但是 // 适配之后,他们都能用pay()来实现支付功能。 $wechatPay = new WechatPay(); $wechatPay->scan(); $wechatPay->doPay(); } }
クライアントの使用法:
// 客户端代码 $wechat = new WechatPayAdapter(); // 也是用pay()方法实现支付 $wechat->pay();
これはアダプターの拡張機能です。
サードパーティ クラス (Alipay、WeChat Pay) を処理するためのメソッドを作成しました。
API が変更された場合、サードパーティ クラス自体を変更したり公開したりすることなく、クライアントが依存するアダプター クラスを変更するだけで済みます。 。
UML 図
上記のアダプター パターンのコードは、次のように UML に対応します。
概要
大規模なアプリケーションでは、新しいライブラリと新しい API が追加され続けます。
変更によって引き起こされる問題を回避するには、アプリケーションに統一された参照方法を提供するために、変更をアダプター パターンにパッケージ化する必要があります。
これにより、コードがより構造化され、管理と拡張が容易になります。
以上がオブジェクト指向の高度な設計パターン:アダプタパターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。