标签:
不知道什么时候开始,总听到“ XXX 小伙娶乌克兰美女” 的新闻,比如 农村小伙娶乌克兰美女语言不通 翻译软件立功 等等,我仔细地看了几篇新闻,发现居然不是标题党,新闻里的乌克兰妹子长得真不错,上几张图:
看完这些新闻和照片,我心里有三个疑问;
1. 乌克兰真的美女很多吗?
2. 为什么乌克兰美女爱嫁给中国男人?
3. 翻译软件可以化腐朽为神奇,软件开发过程中是否可以参考呢?
经过我大量的研究,得出了答案:
答:是的。
- 首先从世界地图可以看到,乌克兰地处东欧多个国家交界处,国内民族多达 110 个,各名族之间通婚比较多,久而久之导致混血美女比例比较高。
- 而且,乌克兰的气候环境也比较养人,一年到头冷多热少,阳光直射时间短,导致大多数女孩子皮肤白皙。
- 除此外,乌克兰姑娘特别注重外表,打扮的比较精致时尚。
答:除主观因素外,有两点客观因素很重要。
- 近些年乌克兰并不富裕,距离大家心中的资本主义发达国家还有段距离。一方面生产停滞,经济增长无力;另一方面,乌克兰还要面临战乱带来的货币贬值、外资流出、物价上涨等压力,财政“只出不进”,整个国家“干耗”外汇储备。所以许多乌克兰姑娘选择外嫁。
- 此外,由于文化、社会福利等原因,许多乌克兰男人有酗酒、懒散的习惯,而中国男人在国际上给人一种体贴、勤劳、顾家的形象,所以相较之下,中国男人是比较好的选择。
翻译软件把小伙的汉语转换成了乌克兰语,在软件开发过程中这就是一种“复用”!那有什么设计模式可以达到这种效果呢?
我们先来模拟实现下这个翻译过程:
a.首先定义一个小目标,就是可以跟妹子说乌克兰语,萨瓦迪卡爱米思油~
/**
* 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) {
//省略了复杂的语法翻译过程,想象一下
mChinese.sayChinese(string);
}
}
d.可以看到,翻译器持有一个只会中文小伙的引用,实现了说乌克兰语的接口,在需要说乌克兰语的时候,经过语法翻译最终调用小伙的说中文:
@Test
public void testAdapterPattern(){
Chinese me = new Chinese();
Ukrainian ukrainianMan = new Translator(me);
ukrainianMan.sayUkrainian("我爱你");
}
e.翻译 + 川普小伙 = 乌克兰语达人,运行结果:
f.画一下上面这个过程的 UML 图:
@Test
public void testAdapterPattern(){
Chinese me = new Chinese();
Ukrainian ukrainianMan = new Translator(me);
ukrainianMan.sayUkrainian("我爱你");
}
将一个类的接口转换为客户希望的另一个接口。
适配器模式可以使原本不兼容的接口变得兼容,即能复用。
上面举的例子就是适配器 。Adapter 中持有一个被适配类对象的引用,因此叫做对象适配器。
对象适配器的 UML 图和上述例子一致,所以就偷个懒不列出来了。
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("刘奶奶找牛奶奶买榴莲牛奶");
}
对比一下对象适配器的代码:
/**
* 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 的适配器了,本来准备下一篇就写 ListVIew 源码中的适配器模式,但考虑到 ListView 中还有观察者模式,所以下一步先总结观察者模式,然后再统一进行 ListView 源码解析。
适配器模式以达到适配最终接口为目的,
代理模式以拦截、处理为目的。
标签:
原文地址:http://blog.csdn.net/u011240877/article/details/52601040