其實我感覺這個模式是最簡單的一個設計模式了,看着名字可能不明白,其原來就是一個接口。比如電腦的USB接口,內部不管外部插得什麼設備只要連接USB,內部都能接收到信號,原因就是兩設備之間多了個橋樑------USB。
適配器模式:將一個類的接口轉換成客戶希望的另一個接口。它使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。
<<大話設計模式>>是以NBA球員在外國培訓不懂外語,而需要翻譯者來幫其翻譯,那這個翻譯者就是接口了。好囉嗦啊,還是用代碼解釋一切,因爲程序員就是活在代碼的世界裏。
1、運動員抽象類
/**
* @author jzhf
* 2014-11-05
*/
public abstract class Player {
public String name;
public abstract void attack();//進攻
public abstract void defense();//防守
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、前鋒類
public class Forward extends Player {
public Forward(String name){
super.name = name;
}
/* (non-Javadoc)
* @seecom.test.model.adapter.Player#attack()
*/
@Override
public void attack() {
// TODO Auto-generatedmethod stub
System.out.println(name+"前鋒攻擊");
}
/* (non-Javadoc)
* @seecom.test.model.adapter.Player#defense()
*/
@Override
public void defense() {
// TODO Auto-generatedmethod stub
System.out.println(name+"前鋒防守");
}
}
3、防守類
/**
* @author jzhf
* 2014-11-05
* 注意不再繼承player類,因爲需要翻譯
*/
public class ForeignCenter{
public String name;
public void attack() {
// TODO Auto-generatedmethod stub
System.out.println(name+"外籍中鋒攻擊");
}
public void defense() {
// TODO Auto-generatedmethod stub
System.out.println(name+"外籍中鋒防守");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
4、翻譯者類
/**
* @author jzhf
* 2014-11-05
* 翻譯者作爲player與外籍隊員的接口,所以翻譯者應該繼承player,但是執行的動作還是外籍球員的動作
*/
public class Translator extends Player {
private ForeignCenter center = new ForeignCenter();
public Translator(String name){
center.setName(name);
}
/* (non-Javadoc)
* @seecom.test.model.adapter.Player#attack()
*/
@Override
public void attack() {
// TODO Auto-generatedmethod stub
center.attack();
}
/* (non-Javadoc)
* @seecom.test.model.adapter.Player#defense()
*/
@Override
public void defense() {
// TODO Auto-generatedmethod stub
center.defense();
}
}
5、客戶端
public class AdapterClient {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generatedmethod stub
Player player1 = new Forward("巴蒂爾");
player1.attack();
player1.defense();
Player player2 = new Translator("姚明");
player2.attack();
player2.defense();
}
}
翻譯者就是外國語姚明的中間人,爲了讓姚明聽懂外語就需要這樣的接口還適應外國的環境。這就是適配器模式,簡單吧!
總結:適配器模式簡單的說就是需要的東西就在面前,但卻不能使用,而短時間又無法改造它,於是我們就想辦法適配它。當我們使用一個已經存在的類,但如果它的接口,也就是它的方法和你的要求不相同時,就應該考慮用適配器模式了。