不知道甚么時候開始,總聽到“ XXX 小伙娶烏克蘭美女” 的新聞,比如 農村小伙娶烏克蘭美女語言不通 翻譯軟件立功 等等,我仔細地看了幾篇新聞,發現竟然不是標題黨,新聞里的烏克蘭妹子長得真不錯,上幾張圖:
![]()
看完這些新聞和照片,我心里有3個疑問;
1. 烏克蘭真的美女很多嗎?
2. 為何烏克蘭美女愛嫁給中國男人?
3. 翻譯軟件可以化腐朽為奇異,軟件開發進程中是不是可以參考呢?
經過我大量的研究,得出了答案:
答:是的。
- 首先從世界地圖可以看到,烏克蘭地處東歐多個國家交界處,國內民族多達 110 個,各名族之間通婚比較多,長此以往致使混血美女比例比較高。
- 而且,烏克蘭的氣候環境也比較養人,1年到頭冷多熱少,陽光直射時間短,致使大多數女孩子皮膚白凈。
- 除另外,烏克蘭姑娘特別重視外表,打扮的比較精致時尚。
答:除主觀因素外,有兩點客觀因素很重要。
- 近年烏克蘭其實不富裕,距離大家心中的資本主義發達國家還有段距離。1方面生產停滯,經濟增長無力;另外一方面,烏克蘭還要面臨戰亂帶來的貨幣貶值、外資流出、物價上漲等壓力,財政“只出不進”,全部國家“干耗”外匯儲備。所以許多烏克蘭姑娘選擇外嫁。
- 另外,由于文化、社會福利等緣由,許多烏克蘭男人有酗酒、懶惰的習慣,而中國男人在國際上給人1種體貼、勤勞、顧家的形象,所以相較之下,中國男人是比較好的選擇。
翻譯軟件把小伙的漢語轉換成了烏克蘭語,在軟件開發進程中這就是1種“復用”!那有甚么設計模式可以到達這類效果呢?
我們先來摹擬實現下這個翻譯進程:
a.首先定義1個小目標,就是可以跟妹子說烏克蘭語,薩瓦迪卡愛米思油~
/**
* description:目標:說烏克蘭語
* <br/>
* author: shixinzhang
* <br/>
* data: 9/18/2016
*/
public interface Ukrainian {
/**
* 說烏克蘭語,比如:Я люблю тебя
* @param string
*/
void sayUkrainian(String string);
}
b.但是理想很飽滿,現實很骨感,小伙只會川普:
/**
* description:實際情況:只會中文
* <br/>
* author: shixinzhang
* <br/>
* data: 9/18/2016
*/
public class Chinese {
/**
* 說中文,比如:劉奶奶找牛奶奶買榴蓮牛奶
* @param string
*/
void sayChinese(String string) {
System.out.println("【中文版】 " + string);
}
}
c.這時候候翻譯器上場了,化腐朽為神器,幫助小伙具有能說烏克蘭語的功能:
/**
* description:翻譯
* <br/>
* author: shixinzhang
* <br/>
* data: 9/18/2016
*/
public class Translator implements Ukrainian {
private Chinese mChinese;
public Translator(Chinese chinese) {
mChinese = chinese;
}
@Override
public void sayUkrainian(String string) {
//省略了復雜的語法翻譯進程,想象1下
mChinese.sayChinese(string);
}
}
d.可以看到,翻譯器持有1個只會中文小伙的援用,實現了說烏克蘭語的接口,在需要說烏克蘭語的時候,經過語法翻譯終究調用小伙的說中文:
@Test
public void testAdapterPattern(){
Chinese me = new Chinese();
Ukrainian ukrainianMan = new Translator(me);
ukrainianMan.sayUkrainian("我愛你");
}
e.翻譯 + 川普小伙 = 烏克蘭語達人,運行結果:
f.畫1下上面這個進程的 UML 圖:
@Test
public void testAdapterPattern(){
Chinese me = new Chinese();
Ukrainian ukrainianMan = new Translator(me);
ukrainianMan.sayUkrainian("我愛你");
}
將1個類的接口轉換為客戶希望的另外一個接口。
適配器模式可使本來不兼容的接口變得兼容,即能復用。
上面舉的例子就是適配器 。Adapter 中持有1個被適配類對象的援用,因此叫做對象適配器。
對象適配器的 UML 圖和上述例子1致,所以就偷個懶不列出來了。
Adapter 通過繼承被適配類,從而可以調用被適配類的方法。
舉個栗子,類適配器下的翻譯中介:
/**
* description: 類適配器下的翻譯中介
* <br/>
* author: shixinzhang
* <br/>
* data: 9/20/2016
*/
public class ClassTranslator extends Chinese implements Ukrainian {
@Override
public void sayUkrainian(String string) {
sayChinese(string);
}
}
采取類適配器模式的翻譯軟件,繼承了被適配類 Chinese,實現了目標接口 Ukrainian,從而使得本來不能使用的 sayChinese(string) 方法可以被調用。
調用時:
@Test
public void testClassAdapterPattern(){
Ukrainian ukrainianMan = new ClassTranslator();
ukrainianMan.sayUkrainian("劉奶奶找牛奶奶買榴蓮牛奶");
}
對照1下對象適配器的代碼:
/**
* description: 翻譯
* <br/>
* author: shixinzhang
* <br/>
* data: 9/18/2016
*/
public class Translator implements Ukrainian {
private Chinese mChinese;
public Translator(Chinese chinese) {
mChinese = chinese;
}
@Override
public void sayUkrainian(String string) {
mChinese.sayChinese(string);
}
}
說起適配器 Adapter,最熟習的就是 ListView 和 RecyclerVIew 的適配器了,本來準備下1篇就寫 ListVIew 源碼中的適配器模式,但斟酌到 ListView 中還有視察者模式,所以下1步先總結視察者模式,然后再統1進行 ListView 源碼解析。
適配器模式以到達適配終究接口為目的,
代理模式以攔截、處理為目的。
上一篇 Xcode8證書錯誤
下一篇 HDFS nnTop統計功能