【设计模式】适配器模式详解(原理 + 代码 + 类图详解)

326 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情 >>

【设计模式】适配器模式详解

适配器模式的定义

什么叫做“适配器模式”?

其实,适配器模式就是将一个类的接口转换成用户希望或者所需要的一个接口;适配器模式使得原来一些可能不兼容的类接口能够和当前工作类一起工作。

试想一下这么一个场景,一个外地人用外语和本地人沟通,本地人听不懂外语,而短时间之内他又不可能学会外语(外地人也一样,短时间之内他也很难学会本地的语言);这时候他们需要沟通的话,最简单的方法就是加一个翻译。翻译者将外语转换为本地语言,那么本地人自然就能听懂了。

其实上面提到的翻译就像是适配器,使得外语能够适配本地人。

适配器模式的使用场景

上面提到了使用适配器模式可以使得原本不兼容的类参与到当前工作中来,所以在实际开发中,适配器模式是在软件开发后期或者是维护阶段才使用的无奈之举。如果是在软件设计阶段的话,完全是可以通过规定开发规范、统一定义接口等方法避免出现兼容问题,如果没有兼容问题的话,其实也就没有适配器模式什么事了。

适配器模式使用举例

假如现在地方a的篮球运动员A去到地方B进行篮球比赛,可是队友和教练都是地方B的人,他们都将语言b,只有球员A讲的是语言a;这时候球员A要听懂语言b,已经来不及学习了,所以他立马采取适配器模式——找了个翻译,翻译者将语言b翻译成语言a给他理解。

适配器模式的设计类图,如下:

image.png

下面展示核心部分代码(翻译者的设计):

public class Translator extends Player {

	public ForeignCerter foreignCerter = new ForeignCerter();

	public Translator(String name) {
		super(name);
		foreignCerter.name = name;
	}

	@Override
	public void attack() {
		foreignCerter.进攻();
	}

	@Override
	public void defense() {
		foreignCerter.防守();
	}
}

测试代码:

public class AdapterPatternTest {
	public static void main(String[] args) {
		Forwards forwards = new Forwards("1");
		forwards.attack();
		Guards guards = new Guards("2");
		guards.attack();
		Player center = new Translator("0");
		center.attack();
		center.defense();
	}
}

通过以上核心代码,相信各位已经对适配器模式有了一定的了解了。

其实适配器就是将当前工作类不懂的东西进行了封装,然后暴露出当前工作累可以看懂的接口,供给当前工作类调用。(当前工作类直接调用适配器,间接调用存在兼容问题的类