適配器模式:用於解決兩個系統之間的不兼容問題,解決兩個接口之間的鏈接問題;ide
目標:將一個類的接口更改成適配另外一個類的接口,而且使這些不兼容的類一塊兒工做。this
最佳解決方案:二者實現同一個接口或者繼承自同一個抽象類spa
類圖UML翻譯
實例:code
例若有一個抽象類Player是籃球運動員,該類姓名屬性,具備兩個方法Attack(),Dfend(),如今中國籃球運動員姚明,調到美國NBA,可是他聽不懂教練的語言,只能配翻譯,blog
翻譯在這個地方就是適配器繼承
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的USAPlayerget
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...."); } }
如今中國運動員的類class
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等格式的媒體文件,因爲這些格式的文件,遵循不一樣的格式,因此必須有一個適配器,使其適應於不一樣格式文件的讀取與播放