首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用"Adapter“模式

使用"Adapter“模式
EN

Stack Overflow用户
提问于 2012-01-14 00:36:40
回答 3查看 896关注 0票数 2

根据我的理解,Adapter模式的目标是使用一些接口(对客户端开放)调用一些类方法。为了制作适配器模式,我们需要实现一些接口(供客户端使用),还需要扩展一些类,客户端在调用接口方法时需要调用这些方法。

代码语言:javascript
复制
class Adapter extends NeedClass implements PublicInterface{}

但是如果我们没有接口,而只有2个类呢?例如,我们有一些类(而不是接口!)哪些方法使用客户端。现在我们需要通过创建adapter类来调用其他类的方法,但是我们不能这样做,因为我们不能在adapter类上进行多重继承。

代码语言:javascript
复制
class Adapter extends NeedClass, PublicInterface

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-14 00:41:43

您可以在Adapter中拥有一个NeedClass实例,并在需要时调用它。因此,您只能从PublicInterface扩展。

代码语言:javascript
复制
public class Adapter extends PublicInterface {

    private NeedClass needClass;

    @Override
    public void doSomething() {
        needClass.doSomethingElse("someParameter");
    }
}
票数 3
EN

Stack Overflow用户

发布于 2012-01-14 00:45:13

您可以使用组合而不是继承。向类型为NeedClass的适配器类添加一个字段:

代码语言:javascript
复制
public class Adapter extends PublicInterface {
    private NeedClass needClass;
}

然后,内部适配器方法将执行委托给needClass字段。

票数 2
EN

Stack Overflow用户

发布于 2015-10-03 16:43:39

根据我对Adapter模式的理解。在处理像API这样的第三部分代码时,这是很有帮助的,因为它随时都会发生变化,如果直接实现的话,可能会破坏你的代码。例如:在您的网站中使用Paypal进行在线支付。让我们假设Paypal使用payMoney()方法进行支付。过了一段时间,他们决定将方法更改为其他方法,比如说sendMoney()。如果直接实现,这可能会破坏您的代码,使用Adapter设计模式可以按如下方式解决此问题

第三部分代码=> Paypal

代码语言:javascript
复制
   class Paypal {
     public function __construct(){
          // their codes 
     }
   public function payMoney($amount){
      // the logic of validating
      // the $amount variables and do the payment
   }   

}

所以直接在代码中实现它,如下所示会破坏代码

代码语言:javascript
复制
$pay = new Paypal();
$pay->payMoney(200);

使用适配器可以节省几个小时的时间,还可以节省将代码从payMoney()更新到sendMoney()的复杂工作。适配器允许在一个地方进行更新,仅此而已。让我们看看。

代码语言:javascript
复制
  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,如下所示;

代码语言:javascript
复制
  $pay = new PaypalAdapter(new Paypal);
  $pay->pay(200);

因此,将来当供应商(Paypal)决定使用sendMoney而不是payMoney时,要做的就是打开PaypalAdapter类,并在pay($amount)方法中执行以下操作:

代码语言:javascript
复制
     // 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);
}   

在一个地方做了这个小小的改变后,一切都像以前一样工作正常。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8853961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档