意图:把一个类的接口变换成客户端所期待的另一种接口,使原本因接口不匹配的两个类能够在一起工作
情景:很多人都喜欢在国内玩外服,可以虐老外嘛- -,但是有个缺点就是语言不通,这里我们可以设计一个功能,将玩家输入的语言自动转换为需要的语言,就用到了适配器模式
1.对象适配
中文接口
public interface
Chinese {
void
speak
(String msg)
;
}
英语类
public class
English {
void
speak
(String msg) {
Log.
e
(
"tag"
,
"
英语
:"
+msg)
;
}
}
适配器类
/**
* Created by LSX on 2018/4/18.
*/
public class
Adapter
implements
Chinese{
private
English
mEnglish
;
public
Adapter
(English mEnglish) {
this
.
mEnglish
= mEnglish
;
}
@Override
public void
speak
(String msg) {
Log.
e
(
"tag:"
,
msg)
;
mEnglish
.speak(msg)
;
}
}
在适配器类种完成转换而已
2.类适配:
adapter添加English父类,其他和上面一样
/**
* Created by LSX on 2018/4/18.
*/
public class
ClassAdapter
extends
English
implements
ClassChinese {
@Override
public void
speakChinese
(String msg) {
speakEnglish(msg)
;
}
}
类适配是直接继承的方式,不需要传入多余的参数,缺点就是不够灵活
3.缺省适配器:
简单的说就是不想实现一个接口的所有方法,比如上面的中文接口,里面增加了普通话三东话和四川话,但是我只想实现普通话,这时就可以创建一个baseAdapter空实现接口的所有方法,让子类选择性继承
中文接口
public interface
DefaultChinese {
void
speakMandarin
(String msg)
;
void
speakCantonese
(String msg)
;
}
英语类
public class
DefaultEnglish {
void
speak
(String msg) {
Log.
e
(
"tag"
,
"
英语
:"
+msg)
;
}
}
适配器基类
public class
DefaultBaseAdapter
implements
DefaultChinese{
@Override
public void
speakMandarin
(String msg) {
}
@Override
public void
speakCantonese
(String msg) {
}
}
适配器类
public class
DefaultAdapter
extends
DefaultBaseAdapter {
private
DefaultEnglish
mEnglish
;
public
DefaultAdapter
(DefaultEnglish mEnglish) {
this
.
mEnglish
= mEnglish
;
}
@Override
public void
speakMandarin
(String msg) {
Log.
e
(
"tag:"
,
msg)
;
mEnglish
.speak(msg)
;
}
}