使用“适配器”模式

时间:2012-01-13 16:36:40

标签: java design-patterns adapter

我理解,适配器模式的目标是使用某个接口(向客户端打开)调用某些类方法。要制作适配器模式,我们需要实现一些接口(由客户端使用),并且我们还需要扩展一些类,客户端在调用接口方法时需要调用这些类。

class Adapter extends NeedClass implements PublicInterface{}

但是,如果我们没有接口,但只有2个类怎么办?例如,我们有一些类(不是接口!),哪些方法使用客户端。现在我们需要通过制作适配器类来调用其他类的方法,但是我们不能这样做,因为我们不能在适配器类上进行多次继承。

class Adapter extends NeedClass, PublicInterface

上面的代码不起作用。 在这种情况下我们能做些什么?

3 个答案:

答案 0 :(得分:3)

您可以在NeedClass中拥有Adapter的实例,并在需要时将其调用。所以你只从PublicInterface扩展。

public class Adapter extends PublicInterface {

    private NeedClass needClass;

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

答案 1 :(得分:2)

您可以使用合成而不是继承。将字段添加到NeedClass类型的Adapter类:

public class Adapter extends PublicInterface {
    private NeedClass needClass;
}

然后在Adapter方法内部将执行委托给needClass字段。

答案 2 :(得分:1)

从我理解的适配器模式。 在处理第三部分代码(例如API)时会很有帮助,这些代码随时可能会发生变化,如果直接实施,我可能会破坏您的代码。 例如:在您的网站中使用Paypal进行在线支付。我们假设Paypal使用payMoney()方法进行支付。并且在一段时间之后他们决定将方法更改为其他东西让我们说sendMoney()。如果直接实现,这可能会破坏您的代码,使用适配器设计模式,这可以解决如下

第三部分代码=>贝宝

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

使用适配器将节省大量时间,并且在每个API脚本实现的位置都会将代码从payMoney()更新为sendMoney()。适配器在一个地方启用更新,就是这样。 让我们看看吧。

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

在一个地方发生这种微小变化之后,一切都像以前一样运作良好。