根据我的理解,Adapter模式的目标是使用一些接口(对客户端开放)调用一些类方法。为了制作适配器模式,我们需要实现一些接口(供客户端使用),还需要扩展一些类,客户端在调用接口方法时需要调用这些方法。
class Adapter extends NeedClass implements PublicInterface{}但是如果我们没有接口,而只有2个类呢?例如,我们有一些类(而不是接口!)哪些方法使用客户端。现在我们需要通过创建adapter类来调用其他类的方法,但是我们不能这样做,因为我们不能在adapter类上进行多重继承。
class Adapter extends NeedClass, PublicInterface上面的代码不起作用。在这种情况下我们能做什么?
发布于 2012-01-14 00:41:43
您可以在Adapter中拥有一个NeedClass实例,并在需要时调用它。因此,您只能从PublicInterface扩展。
public class Adapter extends PublicInterface {
private NeedClass needClass;
@Override
public void doSomething() {
needClass.doSomethingElse("someParameter");
}
}发布于 2012-01-14 00:45:13
您可以使用组合而不是继承。向类型为NeedClass的适配器类添加一个字段:
public class Adapter extends PublicInterface {
private NeedClass needClass;
}然后,内部适配器方法将执行委托给needClass字段。
发布于 2015-10-03 16:43:39
根据我对Adapter模式的理解。在处理像API这样的第三部分代码时,这是很有帮助的,因为它随时都会发生变化,如果直接实现的话,可能会破坏你的代码。例如:在您的网站中使用Paypal进行在线支付。让我们假设Paypal使用payMoney()方法进行支付。过了一段时间,他们决定将方法更改为其他方法,比如说sendMoney()。如果直接实现,这可能会破坏您的代码,使用Adapter设计模式可以按如下方式解决此问题
第三部分代码=> 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()的复杂工作。适配器允许在一个地方进行更新,仅此而已。让我们看看。
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);
} 在一个地方做了这个小小的改变后,一切都像以前一样工作正常。
https://stackoverflow.com/questions/8853961
复制相似问题