2012-01-13 9 views
2

私が理解するように、Adapterパターンの目的は、いくつかのインタフェース(クライアントに対して開かれた)を使用していくつかのクラスメソッドを呼び出すことです。アダプタパターンを作成するには、(クライアントによって使用される)いくつかのインタフェースを実装する必要があります。また、インタフェースメソッドを呼び出すときにクライアントが呼び出す必要があるいくつかのクラスを拡張する必要があります。"Adapter"パターンの使用

class Adapter extends NeedClass implements PublicInterface{} 

しかし、インターフェイスがなくても2つのクラスしかない場合はどうなりますか?たとえば、クライアントがメソッドを使用するいくつかのクラス(インターフェイスではありません)があります。アダプタクラスで他のクラスのメソッドを呼び出す必要がありますが、アダプタクラスで複数の継承を行うことができないため、これを行うことはできません。

class Adapter extends NeedClass, PublicInterface 

上記コードは動作しません。 この場合、私たちは何ができますか?

+0

"アダプタクラスの内部から他のクラスのメソッドを呼び出す必要があります"、または他の誰かがアダプタクラスのAPIとしてこれらのメソッドを期待していますか? –

+0

"他のクラス" = NeedClass(上記のコードでは)。 "その他のクラス"メソッドは、PublicInterfaceメソッド内で呼び出される必要があります。その場合は – MyTitle

+1

、Nikitaの答えはあなたの選択です。それはアダプターパターンの一般的な実装です –

答えて

3

NeedClassのインスタンスがAdapterにあり、必要に応じて呼び出すことができます。したがって、あなたはPublicInterfaceからのみ拡張されます。

public class Adapter extends PublicInterface { 

    private NeedClass needClass; 

    @Override 
    public void doSomething() { 
     needClass.doSomethingElse("someParameter"); 
    } 
} 
+0

はい、あなたは、thnaks。 Спасибо) – MyTitle

+0

@Hello、あなたは大歓迎です。 Пожалуйста。 –

2

継承の代わりにコンポジションを使用できます。 NeedClass型のアダプタクラスにフィールドを追加します。

public class Adapter extends PublicInterface { 
    private NeedClass needClass; 
} 

次に、アダプタメソッドはneedClassフィールドに実行を委譲します。

1

私はアダプタパターンを理解しています。 いつでも変更される可能性のあるAPIや、実装されたコードを壊す可能性があるAPIなどの第3の部分コードを扱うときに役立ちます。 例:支払いオンラインであなたのサイトのPaypalを使用しています。PayPalは支払いのためにpayMoney()メソッドを使用すると仮定します。しばらくしてから、メソッドを何かに変更してsendMoney()と言うことにします。これは、直接実装されている場合、あなたのコードを壊す可能性があるアダプターデザインパターンを使用して、これは

に第3の部分のコードに従ってください=>ペイパル

class Paypal { 
    public function __construct(){ 
      // their codes 
    } 
    public function payMoney($amount){ 
     // the logic of validating 
     // the $amount variables and do the payment 
    } 

}

として解くことができるので、それを実装します直接コード内で以下のようにsendMonに時間の数字とpayMoney(からコードを更新する複雑な作業)を保存するアダプタを使用してコード

$pay = new Paypal(); 
$pay->payMoney(200); 

を中断しますAPIスクリプトが実装されているすべての場所でey()アダプターは1つの場所で更新を有効にします。それだけです。 見てみましょう。

class paypalAdapter { 

    private $paypal; 
    // Paypal object into construct and check if it's pa 
    // Paypal object via type hint 
    public function __construct(PayPal $paypal) { 
     $this->paypal = $paypal; 
    } 
    // call the Paypal method in your own 
    //custom method that is to be 
    // implemented directly into your code 
    public function pay($amount) { 
     $this->paypal->payMoney($amount); 
} 

}

ので、それはそのようなもので、そこに行くと次のようにコードに直接PaypalAdaterを使用することができます。

 // SEE THIS METHOD ABOVE TO OBSERVE CHANGES 
    // FROM $this->paypal->payMoney($amount); 
    // TO $this->paypal->senMoney($amount); 
    public function pay($amount) { 
     $this->paypal->sendMoney($amount); 
} 
:将来的にはそう

$pay = new PaypalAdapter(new Paypal); 
    $pay->pay(200); 

ベンダー(ペイパル)が行われなければ何の代わりpayMoneyのsendMoneyを使用することを決定した方法有料($量)で、次のPaypalAdapterクラスを開いて行うことです

この小さな変更が1か所で行われた後は、以前と同じようにすべてがうまく機能します。

+0

コードの一部がここにないと思いますね。 –

+0

はい息子が、今は終わった – mwangaben

関連する問題