公号:码农充电站pro
主页:https://codeshellme.github.iohtml
本篇来介绍适配器模式(Adapter Design Pattern),它能够将两个不兼容的接口变得兼容,而不需改变原有代码。java
生活中有不少经常使用的适配器,好比接口转换器和电源转换器。git
接口转换器能够将两个不匹配的多媒体接口变得匹配;电源转换器能够将两个不匹配的插头和插座变得匹配。github
咱们能够将适配器的做用抽象成下面的图。下图中的两个系统是不兼容的:算法
这时能够建立一个适配器:shell
通过这个适配器,能够将两个不兼容的系统兼容在一块儿:ide
适配器的好处在于,它并无修改原来的系统,而是再建立一个新的组件来达到咱们的需求。this
适配器模式将一个类的接口转换成客户指望的另外一个接口,使得本来接口不兼容的类能够相互合做。设计
适配器模式能够分为对象适配器和类适配器两种,每种适配器中都有四个重要的组件:code
适配器将被适配者转换成目标接口,以供客户使用。
对象适配器使用组合的方式,其类图以下:
由于对象适配器使用组合的方式实现,因此,对于 Adaptee 的全部子类,Adapter 均可以进行适配。
类适配器使用多继承的方式,其类图以下:
下面列举一个对象适配器的例子,来体会一下如何使用适配器模式。
假如,咱们有一个汽车类和一个自行车类:
interface BicycleInterface { void ride(); } class Bicycle implements BicycleInterface { public void ride() { System.out.println("I am riding a bicycle."); } } interface CarInterface { void drive(); } class Car implements CarInterface { public void drive() { System.out.println("I am driving a car."); } }
小明只会骑自行车而不会开汽车:
public class Adapter { // 小明只会骑自行车 public static void xiaoMing(BicycleInterface b) { b.ride(); } public static void main(String[] args) { Bicycle b = new Bicycle(); Car c = new Car(); xiaoMing(b); // I am riding a bicycle. // xiaoMing(c); // 类型不匹配,不会开汽车 } }
为了避免改变 xiaoMing
方法,也就是小明不用学会开汽车,也能用骑自行车的方式开汽车,咱们构造了一个 CarAdapter
,CarAdapter
继承了 BicycleInterface
接口,以下:
class CarAdapter implements BicycleInterface { private CarInterface car; public CarAdapter(CarInterface car) { this.car = car; } public void ride() { car.drive(); } }
CarAdapter
能够将 Car
适配成 Bicycle
,这样小明在 CarAdapter
的帮助下也能开汽车了:
CarAdapter ca = new CarAdapter(c); // 将 Car 适配成 Bicycle xiaoMing(ca); // 小明能够开汽车了
我将完整的代码放在了这里,供你们参考。
也许你已经看出来了,其实适配器模式也是一种装饰对象的方式,就像装饰者模式同样。它们不一样点是:
因此,这两种模式的设计意图是不一样的。
(本节完。)
推荐阅读:
欢迎关注做者公众号,获取更多技术干货。