适配器模式 : 农村小伙娶乌克兰美女语言不通 翻译软件立功
2016-12-11 21:47
302 查看
翻译软件可以化腐朽为神奇,软件开发过程中是否可以参考呢?
翻译软件把小伙的汉语转换成了乌克兰语,在软件开发过程中这就是一种“复用”!那有什么设计模式可以达到这种效果呢?
我们先来模拟实现下这个翻译过程:
a.首先定义一个小目标,就是可以跟妹子说乌克兰语,萨瓦迪卡爱米思油~
/** * description:目标:说乌克兰语 * <br/> * author: shixinzhang * <br/> * data: 9/18/2016 */ public interface Ukrainian { /** * 说乌克兰语,比如:Я люблю тебя * @param string */ void sayUkrainian(String string); }1
2
3
4
5
6
7
8
9
10
11
12
13
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
b.然而理想很丰满,现实很骨感,小伙只会川普:
/** * description:实际情况:只会中文 * <br/> * author: shixinzhang * <br/> * data: 9/18/2016 */ public class Chinese { /** * 说中文,比如:刘奶奶找牛奶奶买榴莲牛奶 * @param string */ void sayChinese(String string) { System.out.println("【中文版】 " + string); } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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); } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
d.可以看到,翻译器持有一个只会中文小伙的引用,实现了说乌克兰语的接口,在需要说乌克兰语的时候,经过语法翻译最终调用小伙的说中文:
@Test public void testAdapterPattern(){ Chinese me = new Chinese(); Ukrainian ukrainianMan = new Translator(me); ukrainianMan.sayUkrainian("我爱你"); }1
2
3
4
5
6
1
2
3
4
5
6
e.翻译 + 川普小伙 = 乌克兰语达人,运行结果:
f.画一下上面这个过程的 UML 图:
目标类,即能说乌克兰语,是一个接口;
实际情况,即只能说汉语,是一个既成的、无法改变的类;
中间人,即翻译软件,实现目标接口(乌克兰语),引用了实际情况(中国小伙),经过偷梁换柱,让中国小伙具有了新的功能
Client 客户端,乌克兰妹子,希望能和会乌克兰语的人沟通,由于翻译软件实现了乌克兰语接口,因此可以直接实例化一个翻译软件作为乌克兰语人。
@Test public void testAdapterPattern(){ Chinese me = new Chinese(); Ukrainian ukrainianMan = new Translator(me); ukrainianMan.sayUkrainian("我爱你"); }1
2
3
4
5
6
1
2
3
4
5
6
这就是适配器模式,又称包装模式
定义
将一个类的接口转换为客户希望的另一个接口。 适配器模式可以使原本不兼容的接口变得兼容,即能复用。
一个很形象的例子
适配器模式主要分为两种:类适配器和对象适配器
1.对象适配器,与被适配类是关联关系
上面举的例子就是适配器 。Adapter 中持有一个被适配类对象的引用,因此叫做对象适配器。
对象适配器的 UML 图和上述例子一致,所以就偷个懒不列出来了。
2.类适配器,与被适配类是继承关系
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); } }1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
采用类适配器模式的翻译软件,继承了被适配类 Chinese,实现了目标接口 Ukrainian,
从而使得原本不能使用的 sayChinese(string) 方法可以被调用。
调用时:
@Test public void testClassAdapterPattern(){ Ukrainian ukrainianMan = new ClassTranslator(); ukrainianMan.sayUkrainian("刘奶奶找牛奶奶买榴莲牛奶"); }1
2
3
4
5
1
2
3
4
5
对比一下对象适配器的代码:
/** * 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); } }1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
可以看到,对象适配器支持传入一个被适配器对象,因此可以做到对多种被适配接口进行适配,
而类适配器直接继承,无法动态修改,所以一般情况下对象适配器使用更广泛。
使用场景:就是想复用,不想多创建!
通常在软件开发后期或者维护期使用,因为这个接口可能已经投入使用,但是对新需求不太符合,我们希望尽可能复用原有接口,所以用适配器进行包装一下。 .
或者一开始设计不合理,功能相似,由于参数或者名称等细小原因不能重用时,也可以考虑包装一下。
《大话设计模式》里看到的一段话很好
事先设计统一接口问题初现及时重构(下策)
无法改变只能适配(下下策)
后记
说起适配器 Adapter,最熟悉的就是 ListView 和 RecyclerVIew 的适配器了,本来准备下一篇就写 ListVIew 源码中的适配器模式,但考虑到 ListView 中还有观察者模式,
所以下一步先总结观察者模式,然后再统一进行 ListView 源码解析。
适配器模式和代理模式的区别
从我们这两个设计模式调用的方法可以看出来:
适配器模式调用时强调“最终要转换成的目的接口”,以本文例子,Translator 最终的目的是变成一个 Ukrainian : Ukrainian ukrainianMan = new Translator(me);
然后客户端调用的是 Ukrainian 的方法
而代理模式是通过代理,拦截调用,最终以代理类完成工作,以我这篇文章http://blog.csdn.net/u011240877/article/details/52264283 为例 :
Agent songJJ = new Agent(baoqiang, false);
总结:
适配器模式以达到适配最终接口为目的, 代理模式以拦截、处理为目的。
代码地址点这里
原文地址:http://blog.csdn.net/u011240877/article/details/52601040相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- 设计模式---状态模式在web前端中的应用
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 解析C#设计模式编程中适配器模式的实现
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C# 设计模式系列教程-建造者模式
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解