这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战设计模式
整体来讲设计模式分为三大类:建立型模式、结构型模式、行为型模式。前面的系列文章都是为建立型模式:markdown
<建造者模式>编码
从今天起,咱们开始学习结构型模式。spa
结构型模式:主要用于描述如何组合类和对象以得到更大的结构。设计
适配器模式(Adapter Pattern)定义:将一个类的接口转换成客户但愿的另一个接口,使得本来因为接口不兼容而不能一块儿工做的那些类能一块儿工做code
适配器模式核心意义:兼容旧接口orm
适配器在咱们生活中随处可见,好比电源适配器,不少电器并非直接使用220V电源,而须要一个电源适配器才能正常使用;还有咱们笔记本电脑的外接接口,若是只有一个HDMI接口,想用在只能使用VGA接口上的设备上,咱们就须要一个额外转接头,这个转接头咱们就称做适配器。
适配器模式原理咱们就能够理解成适配器在生活中的做用。
适配器模式包含三个角色:
这三种角色用笔记本电脑外接接口例子来讲,HDMI接口是咱们的目标接口,由于咱们电脑提供功能是HDMI接口视频输出;VGA设备就是适配者,咱们最终须要把视频输出在VGA设备上;转接头就是咱们的适配器
如今咱们有一个1.0版本商城场景,系统刚运行起来,咱们没有自营商品,当前的商品都是第三方提供的,因此咱们商品下单时,要对接第三方下单服务:
// 第三方订单服务
public class ThirdOrderService {
// 调用该方法,实现第三方接口下单
void thirdCreateOrder() {
System.out.println("第三方服务接口下单");
}
}
复制代码
后面咱们商城系统发展起来了,对于商城的绝大部分商品,都变为自营的了,后续商品的下单只须要咱们调用本身的下单接口。
// 订单服务接口
public interface OrderService {
/**
* 建立订单接口
*/
void createOrder();
}
复制代码
可是,商城还有少部分是第三方提供的的商品,而咱们新的建立订单接口并不兼容旧第三方接口。这时候,咱们就可使用适配器模式,使新的订单接口兼容旧的第三方接口
// 第三方订单接口适配器
public class ThirdOrderServiceAdapter implements OrderService {
private ThirdOrderService thirdOrderService;
public ThirdOrderServiceAdapter() {
thirdOrderService = new ThirdOrderService();
}
@Override
public void createOrder() {
thirdOrderService.thirdCreateOrder();
}
}
复制代码
客户端使用状况
public class Client {
public static void main(String[] args) {
OrderService orderService = new ThirdOrderServiceAdapter();
orderService.createOrder();
}
}
// 输出结果:
第三方服务接口下单
复制代码
从客户端调用来看,咱们经过第三方订单接口适配器,使新的建立订单接口兼容了旧的第三方接口调用。
适配器模式通常有两种不一样的适配方法:对象适配和类适配。上面所演示的就是对象适配(经过组合方式)。接下来咱们看看类适配器,经过继承方式实现。
public class ThirdOrderServiceAdapter2 extends ThirdOrderService implements OrderService {
@Override
public void createOrder() {
// 调用父类的第三方订单建立接口
super.thirdCreateOrder();
}
}
复制代码
一般,咱们喜欢使用组合多于继承,因此更经常使用的是对象适配方式。类适配方式违背了咱们的组合/聚合复用原则