我理解,适配器模式的目标是使用某个接口(向客户端打开)调用某些类方法。要制作适配器模式,我们需要实现一些接口(由客户端使用),并且我们还需要扩展一些类,客户端在调用接口方法时需要调用这些类。
class Adapter extends NeedClass implements PublicInterface{}
但是,如果我们没有接口,但只有2个类怎么办?例如,我们有一些类(不是接口!),哪些方法使用客户端。现在我们需要通过制作适配器类来调用其他类的方法,但是我们不能这样做,因为我们不能在适配器类上进行多次继承。
class Adapter extends NeedClass, PublicInterface
上面的代码不起作用。 在这种情况下我们能做些什么?
答案 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);
}
在一个地方发生这种微小变化之后,一切都像以前一样运作良好。