适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使的原本因接口不匹配而无法在一起工作的两个类能够在一 起工作。
使用场景:系统需要现有的类,而此类的接口不符合系统的需要,即接口不兼容;
想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作;
需要一个统一的输出接口,而输入端的类型不可预知;
适配器模式 分为 类适配 和 对象适配 ,接下来我们看看两者如何实现。
场景:超市进了一批干果和水果,店员需要进行统计产地,在每个商品的标签是展示给客户。
店员统计类:
class ProductNotes {
//记录该产品的产地
String place;
public void setPlace(Fruit fruit) {
this.place = fruit.place();
}
}
店员只需要把商品对象给了统计系统就好,系统就会自己取好产品产地。但是有一点,该店之前是水果店,统计系统只能识别水果接口的产地,现在店面加大了,出售干果了,我们就无法输入了。先看一下干果类:
class Peanut implements Dryfruit{
@Override
public String place() {
return "shangdong";
}
}
现在我们需要把干果也可以输入系统中怎么办?先看看类适配器:
class Peanut implements Dryfruit, Fruit {
@Override
public String place() {
return "shangdong";
}
}
上面是花生类,在它的类中实现水果接口,可以输入统计系统了,这就是类适配。接下来看看对象适配:
class PeanutNotes implements Fruit {
private Dryfruit dryfruit;
public PeanutNotes(Dryfruit dryfruit) {
this.dryfruit = dryfruit;
}
@Override
public String place() {
return dryfruit.place();
}
}
这就是对象适配模式,看起来是不是特像代理模式。其实,就是代理模式。代理模式在很多模式中都会有体现。
对象适配模式的优点:1. 不会像类适配一样使得类中实现本不属于自己的接口(如:花生类实现水果接口其实不合适的)
2. 类适配模式修改了之前代码,没有对修改关闭。
缺点: 需要新增类,增加了项目管理成本。