オブジェクト指向の高度な設計パターン:アダプタパターン

巴扎黑
リリース: 2023-03-07 19:44:02
オリジナル
1766 人が閲覧しました

アダプターパターンとは何ですか?

アダプター パターンは、オブジェクトのインターフェイスを、別のオブジェクトが予期するインターフェイスに単純に適合させます。

アダプター パターン アプリケーションの問題と解決策

アプリケーションでは、アーキテクチャ的に信頼性が高く安定した実用的なコード ベースを使用できます。しかし、既存のオブジェクトを当初の設計とは異なる方法で使用する必要がある新しい機能を追加することもよくあります。この時点での障害は、単に新しい機能に別の名前が必要であるということかもしれません。より複雑なシナリオでは、新しい機能が元のオブジェクトとはわずかに異なる動作を必要とすることが障害となる場合もあります。

上記の問題に対応して、私たちが採用した解決策は、アダプター パターンを使用して別のオブジェクトを構築することです。このアダプタ オブジェクトは、元のアプリケーションと新しい機能の間の仲介者として機能します。アダプター パターンは、新しいオブジェクトの要件に一致する既存のオブジェクトの新しいインターフェイスを定義します。

質問

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!