适配器模式:用于解决两个系统之间的不兼容问题,解决两个接口之间的连接问题;
目标:将一个类的接口更改为适配另一个类的接口,并且使这些不兼容的类一起工作。
最佳解决方案:两者实现同一个接口或者继承自同一个抽象类
类图UML
实例:
例如有一个抽象类Player是篮球运动员,该类姓名属性,具有两个方法Attack(),Dfend(),现在中国篮球运动员姚明,调到美国NBA,但是他听不懂教练的语言,只能配翻译,
翻译在这个地方就是适配器
Player抽象类
public abstract class Player { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public abstract void Attack(); public abstract void Dfend(); }
继承自Player的USAPlayer
public class USAPlayer extends Player { public USAPlayer(String name){ super.setName(name); } @Override public String getName() { return super.getName(); } @Override public void setName(String name) { super.setName(name); } @Override public void Attack() { System.out.println(super.getName()+"正在Attack...."); } @Override public void Dfend() { System.out.println(super.getName()+"正在Dfend...."); } }
现在中国运动员的类
public class ChinaPlayer {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void ChinaAttack(){
System.out.println(this.getName()+"进攻....");
}
public void ChinaDfend(){
System.out.println(this.getName()+"防守....");
}
}
为了使教练组能够像调用Player一样ChinaPlayer类
使用翻译类
public class Translater extends Player { private ChinaPlayer chinaPlayer =new ChinaPlayer(); public Translater(String name){ chinaPlayer.setName(name); } @Override public String getName() { return chinaPlayer.getName(); } @Override public void setName(String name) { chinaPlayer.setName(name); } @Override public void Attack() { chinaPlayer.ChinaAttack(); } @Override public void Dfend() { chinaPlayer.ChinaDfend(); } }
主程序代码
public class Main { public static void main(String[] args) { Player p1=new USAPlayer("Jordan"); Player p2=new USAPlayer("James"); Player p3=new Translater("姚明"); p1.Attack(); p1.Dfend(); p2.Attack(); p2.Dfend(); p3.Attack(); p3.Dfend(); } }
运行效果
核心目的,解决两个不兼容的类直接兼容的问题。
类似的还有比如用播放器播放MP3,MP4,AVI等格式的媒体文件,由于这些格式的文件,遵循不同的格式,所以必须有一个适配器,使其适应于不同格式文件的读取与播放