Использование шаблона «Адаптер» - PullRequest
2 голосов
/ 13 января 2012

Насколько я понимаю, цель шаблона Adapter - вызывать некоторые методы класса, используя некоторый интерфейс (открытый для клиентов).Чтобы создать шаблон адаптера, нам нужно реализовать некоторый интерфейс (который используется клиентом), а также нам нужно расширить некоторый класс, методы которого клиент должен вызывать при вызове методов интерфейса.

class Adapter extends NeedClass implements PublicInterface{}

Но что если мыне имеет интерфейса, но есть только 2 класса?Например, у нас есть некоторый класс (не интерфейс!), Методы которого используют клиенты.Теперь нам нужно вызвать методы другого класса, создав класс адаптера, но мы не можем этого сделать, потому что мы не можем создать множественное наследование для класса адаптера.

class Adapter extends NeedClass, PublicInterface

Код выше не работает.Что мы можем сделать в этом случае?

Ответы [ 3 ]

3 голосов
/ 13 января 2012

Вы можете иметь экземпляр NeedClass в Adapter и вызывать его, когда вам нужно.Таким образом, вы расширяете только от PublicInterface.

public class Adapter extends PublicInterface {

    private NeedClass needClass;

    @Override
    public void doSomething() {
        needClass.doSomethingElse("someParameter");
    }
}
2 голосов
/ 13 января 2012

Вы можете использовать композицию вместо наследования. Добавьте поле в класс адаптера типа NeedClass:

public class Adapter extends PublicInterface {
    private NeedClass needClass;
}

Затем внутри методов адаптера делегируйте выполнение в поле needClass.

1 голос
/ 03 октября 2015

Из того, что я понял шаблон адаптера.это полезно при работе с кодами третьей части, такими как API, которые могут / могут подвергаться изменениям в любое время, и я могу сломать ваш код, если он будет реализован напрямую.Например: при использовании Paypal на вашем сайте для оплаты online.let предполагается, что Paypal использует метод payMoney () для оплаты.и через некоторое время они решают изменить метод на что-то еще, скажем, sendMoney ().Это может привести к поломке вашего кода, если он будет реализован напрямую, с использованием шаблона проектирования адаптера это можно решить следующим образом:

код третьей части => Paypal

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

}

, поэтому реализуйте его непосредственно в коде, как показано ниже. Код будет нарушен

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

. Использование адаптера сэкономит количество часов и сложную работу по обновлению кода от payMoney () до sendMoney () в каждомгде были реализованы сценарии API.Адаптер включит обновление в одном месте и все.Давай посмотрим.

  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 непосредственно в код следующим образом:

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

Так что в будущем, когдаПоставщик (Paypal) решает использовать sendMoney вместо payMoney. Чтобы открыть класс PaypalAdapter, выполните следующие действия в методе pay ($ amount):

     // 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);
}   

После этого незначительного изменения в одномместо, все работает хорошо, как и раньше.

...