1.模式概述:
官方说法:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
【释义】:类的接口就是类的规范。比如:网店的下订单接口及其实现类。客户希望的另外一个接口就是:通过银行卡来直接付款,也就是:银行的转账接口。那么网店下订单和银行转账,怎么无缝的结合呢?我们就需要一个适配器对象。来对数据进行正确的整合,并给与银行一个合适的数据和请求。
适配器模式【个人理解】:
当两个对象的功能需要联合起来的时候,但是,他们之间又有着一种不可直接
合作的时候,我们就需要一个第三方的配合对象,来实现他们直接的数据对接。从而
来满足他们的合作运营。
就比如说银行和网店之间,需要一个第三方支付公司,来实现买家购物付款一样。因
为银行的系统不可能直接给网店来使用。而网店呢,也不能直接由银行来管理。所以
必须衍生出第三方支付机构来实现他们直接的功能对接,来实现。
{当然,也可以有网店直接来进行数据对接,只是这样,对接效率就非常低下了,因为
每一个网店都要实现一套,就非常繁琐了。有了适配对象,就统一处理了。其实适配器
也是一种对象复用的一种体现,只要有1个,大家都去调用即可。}
2.模式模型:
因为不同的业务系统所关注和处理的业务对象是不同的,所以,直接进行合作联合是无法直接
实现的。所以就需要一个适配环节来处理不同,使得双方可以进行配合运作。
3.实际案例:
代码:
package org.wind.ood.adapter.mod2;
import java.math.BigDecimal;
/**
* 买家
*/
public class Buyer {
private Shop shop = new Shop();
public void buy(int count, BigDecimal price, String name){
System.out.println("买家买了"+count+"个"+price.toString()+"元的 "+name);
boolean rt = shop.sell(count, price, name);
String tip = rt?"成功":"失败";
System.out.println(" 购物"+tip);
}
}
package org.wind.ood.adapter.mod2;
import java.math.BigDecimal;
public class Shop {
private String sellerCardNo = "123...";
private String BuyerCardNo = "656...";
private ZhifuBao zfb = new ZhifuBao();
public boolean sell(int count, BigDecimal price, String name) {
System.out.println("商家卖了"+count+"个"+price.toString()+"元的 "+name);
//调用支付宝的转账接口:付款
return zfb.pay(price.multiply(new BigDecimal(count)), BuyerCardNo , sellerCardNo);
}
}
package org.wind.ood.adapter.mod2;
import java.math.BigDecimal;
/**
*通过适配的客户端处理接口,
*来实现业务的正常流转
*
*通过第三方的适配,来满足客户端的最初的需求
*/
public class ZhifuBao implements Bank {
private Bank bank = new BankImpl();
@Override
public boolean transfer(BigDecimal amount, String from, String to) {
boolean rt = bank.transfer(amount, from, to);
System.out.println("调用银行转账接口成功,订单支付成功! ");
return rt;
}
public boolean pay(BigDecimal multiply, String buyerCardNo, String sellerCardNo) {
System.out.println("支付宝支付了一笔订单:总金额:"+multiply);
return transfer(multiply, buyerCardNo, sellerCardNo);
}
}
package org.wind.ood.adapter.mod2;
import java.math.BigDecimal;
//银行的对外服务接口
public interface Bank {
//转账:把买家银行卡的钱转到卖家的银行卡
public boolean transfer(BigDecimal amount, String from, String to);
}
package org.wind.ood.adapter.mod2;
import java.math.BigDecimal;
public class BankImpl implements Bank {
public boolean transfer(BigDecimal amount, String from, String to) {
System.out.println("银行完成了一次转账业务:从银行卡:"+from
+" 转到银行卡:"+to+" 总金额:"+amount);
return true;
}
}
package org.wind.ood.adapter.mod2;
import java.math.BigDecimal;
public class Test {
public static void main(String[] args) {
Buyer s = new Buyer();
s.buy(3, new BigDecimal("10") , "水杯");//卖了3个10元的水杯
}
}
代码运行结果:
买家买了3个10元的 水杯
商家卖了3个10元的 水杯
支付宝支付了一笔订单:总金额:30
银行完成了一次转账业务:从银行卡:656... 转到银行卡:123... 总金额:30
调用银行转账接口成功,订单支付成功!
购物成功
4.自我总结:
适配器模式:两个有业务间接关系的对象【如:购物与支付】,由于处理业务对象的
不同【订单与钱】,而导致无法进行联合业务的拓展处理,从而需要引进第三方的配
合处理,这就是适配器模式。不管是通过接口的实现,还是类的调用实现,都是通过
第三方【支付宝】来适配最终客户端【银行】的处理,并且满足第一方【购物】的业
务处理。
不仅可以用于整合业务对接,而且,适配器也可以适用于:接口多定义,用户可以选择
实现这样的环境。比如:用户注册,手机号注册,邮箱注册,可以定义2个注册方法接口。
调用方如果只想实现手机号的注册,那么就只实现手机号的注册就可以满足自己的需求了。
就可以不用实现邮箱注册了。其中适配器只是空实现。需要实现的时候,继承适配器,然后
实现相应的方法即可。
所以,我个人的认识范围上总结为:
适配器的2种应用环境:
代理适配器【接口代理实现类】和抽象适配器【接口抽象实现类】