1 定义和作用
定义: 将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适用场景:
- 系统的的数据和行为都正确,但接口不符时,就考虑使用适配器模式。
- 通常在软件开发的后期或者维护期考虑使用。
- 如果在软件开发的初期就使用,那么通常是使用了第三方组件,而这个组件的接口和我们自己的系统接口不同。
注意事项: 适配器模式尽量不要用
如果能事先预防接口不同的问题,不匹配问题就不会发生;在有小得接口不统一问题发生时,及时重构,问题不至于扩大;只有碰到无法改变原有计划和代码的情况时,才考虑适配器。事后控制不如事中控制,事中控制不如事前控制。
优点: 客户代码可以统一调用同一接口,简单,直接,紧凑。
2 UML图
3 NBA例子
3.1 场景
在NBA比赛中,教练只使用英文对后卫、中锋、前锋进行指导,如果有一个不懂英文的后卫,则只能通过翻译的桥梁作用,来对教练对指导作出正确响应。在这个场景中,翻译官的角色就是适配器模式中的适配器。
3.2 UML图
3.3 code
Main
public class Main {
public static void main(String[] args) {
Player a=new Forwards("aaa");
a.attack();
Player b=new Guards("bbb");
b.defense();
Player c=new Translator("姚明");
c.attack();
c.defense();
}
}
Player
public abstract class Player {
private String name;
public Player(String name){
this.name=name;
}
public abstract void attack();
public abstract void defense();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Forwards
public class Forwards extends Player {
public Forwards(String name) {
super(name);
}
@Override
public void attack() {
System.out.println(String.format("前锋%s进攻",super.getName()));
}
@Override
public void defense() {
System.out.println(String.format("前锋%s防守",super.getName()));
}
}
Center
public class Center extends Player {
public Center(String name) {
super(name);
}
@Override
public void attack() {
System.out.println(String.format("中锋%s进攻",super.getName()));
}
@Override
public void defense() {
System.out.println(String.format("中锋%s防守",super.getName()));
}
}
Guards
public class Guards extends Player {
public Guards(String name) {
super(name);
}
@Override
public void attack() {
System.out.println(String.format("后卫%s进攻",super.getName()));
}
@Override
public void defense() {
System.out.println(String.format("后卫%s防守",super.getName()));
}
}
ForeignCenter
public class ForeignCenter {
private String name;
public void 进攻() {
System.out.println(String.format("外籍中锋%s进攻",name));
}
public void 防守() {
System.out.println(String.format("外籍中锋%s防守",name));
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Translator
public class Translator extends Player {
private ForeignCenter foreignCenter=new ForeignCenter();
public Translator(String name) {
super(name);
foreignCenter.setName(name);
}
@Override
public void attack() {
foreignCenter.进攻();
}
@Override
public void defense() {
foreignCenter.防守();
}
}
运行结果
前锋aaa进攻
后卫bbb防守
外籍中锋姚明进攻
外籍中锋姚明防守