适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。
这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。
更多设计模式小故事案例代码详解 >>点我!点我!点我!<< 设计模式,如此简单~
Wrapper (包装)(适配器模式(Adapter Pattern)和装饰器模式(Decorator Pattern)的统称)
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
生活中的例子
你有一个张内存卡,有一台电脑,你现在想要看内存卡上的照片,想听内存卡上的歌,想看内存卡上的电影,但是你直接插电脑上又插不上去,所以你需要一个适配器,那就是读卡器。这样你的内存卡就可以在电脑上运行了。 你的iphone x的手机,想要听歌,但是耳机忘记带了,所以和我来借,可是我是国产的OPPO,所以你从包里拿出来一个转换插头,让耳机插到转换插头上,再插到手机上,这个转换插头就是适配器。 侵华的日本鬼子当年侵华无法和我们沟通,结果你猜怎么着,那个汉奸就是适配器,他把日语转成了中文,把中文转成了日语。勿忘国耻!
简单来讲
适配器模式可以让你在适配器中包装一个与另一个对象不兼容的对象,使其兼容。
将一个类的接口转接成用户所期待的。一个适配使得因接口不兼容而不能在一起工作的类能在一起工作,做法是将类自己的接口包裹在一个已存在的类中。
代码实例讲解
有一个船长,只会使用划艇,不会使用渔船。
首先,我们有接口RowingBoat和FishingBoat
public interface RowingBoat {
void row();
}
public class FishingBoat {
private static final Logger LOGGER = LoggerFactory.getLogger(FishingBoat.class);
public void sail() {
LOGGER.info("The fishing boat is sailing");
}
}并且船长本身是会划艇的,所以船长已经实现了这个接口。
public class Captain implements RowingBoat {
private RowingBoat rowingBoat;
public Captain(RowingBoat rowingBoat) {
this.rowingBoat = rowingBoat;
}
@Override
public void row() {
rowingBoat.row();
}
}现在来了一个海盗,并且只有渔船可以使用,我们的船长想要逃避海盗,就只能使用渔船。所以我们需要一个适配器来帮助船长来用他操作划艇的技术来操作渔船。
public class FishingBoatAdapter implements RowingBoat {
private static final Logger LOGGER = LoggerFactory.getLogger(FishingBoatAdapter.class);
private FishingBoat boat;
public FishingBoatAdapter() {
boat = new FishingBoat();
}
@Override
public void row() {
boat.sail();
}
}现在,船长既可以开着渔船逃避海盗了。
Captain captain = new Captain(new FishingBoatAdapter());
captain.row();什么时候使用适配器模式?
类适配器和对象适配器的区别
类适配器
对象适配器
优点:
缺点: