1.引入:
什么是适配器模式?从“适配”这个词上理解,就是把原来两个不能一起工作的东西可以一起工作。而适配器模式就是使得原来由于接口不兼容而不能一起工作的那些类可以一起工作。(适配=兼容)
2.举例:
一般菜鸟在接手一个老项目之前,需要读下项目的文档。然后发现文档是英文的,而对于菜鸟来说,需要的是中文文档。英文文档看不懂,就没法给老项目升级了。菜鸟不可能现去学英语,提高英语能力(英语是潜移默化的东西),英文文档不能变成中文文档。只有找个翻译师傅,帮他把英文文档翻译成中文文档。而这个翻译师傅就是所谓的适配者,使菜鸟和英文文档两个不兼容的类,可以兼容(适配器的意思就是使一个东西适合另外一个东西)。
3.核心:适配器模式分为类的适配器模式和对象的适配器模式。
--3.1类的适配器模式:
----3.1.1.提供英文文档类:
//英文文档类
public class ForeignDocument {
public void enDoc(){
System.out.println("读英文文档!");
}
}
提供英文文档类主要是提供了英文文档方法。
----3.1.2.菜鸟接口,定义了读中文文档的方法:
//这个是菜鸟的接口,也就是需要适配的接口,也就是需要被兼容的接口。
public interface Iosers {
//读英文文档
public void readCNDoc();
//读中文文档
public void readENDoc();
}
----3.1.3.适配者(翻译者):
//翻译者类
public class Adapter extends ForeignDocument implements Iosers{
@Override
public void readCNDoc() {
// 实现了菜鸟读中文文档的能力
System.out.println("读中文文档!");
}
@Override
public void readENDoc() {
// 使菜鸟兼容了读英文文档的能力。
super.enDoc();
}
}
----3.1.4.测试类:
public static void main(String[] args) {
// TODO Auto-generated method stub
Iosers iosers=new Adapter();
iosers.readCNDoc();
iosers.readENDoc();
}
适配器通过继承英文文档类就可以调用父类(英文文档类)的读英文文档的方法,菜鸟接口就实现了原本读中文文档的能力,又兼容了读英文文档的能力。(读英文文档的能力是适配器通过继承方式,从父类学会)
测试结果:
菜鸟读中文文档!
读英文文档!
--3.2对象的适配器:
----3.2.1.提供英文文档类:
//英文文档类
public class ForeignDocument {
public void enDoc(){
System.out.println("读英文文档!");
}
}
----3.2.2.菜鸟接口,定义了读中文文档的方法:
//这个是菜鸟的接口,也就是需要适配的接口,也就是需要被兼容的接口。
public interface Iosers {
//读英文文档
public void readCNDoc();
//读中文文档
public void readENDoc();
}
----3.2.3.适配者(翻译者)
//翻译者类
public class Adapter implements Iosers{
private ForeignDocument foreignDocument;
public Adapter(ForeignDocument foreignDocument){
this.foreignDocument=foreignDocument;
}
@Override
public void readCNDoc() {
// TODO Auto-generated method stub
System.out.println("读中文文档!");
}
@Override
public void readENDoc() {
// TODO Auto-generated method stub
foreignDocument.enDoc();
}
}
将英文文档类作为属性,然后通过使用构造方法传递英文文档对象。
----3.2.3测试类:
public static void main(String[] args) {
// TODO Auto-generated method stub
ForeignDocument foreignDocument=new ForeignDocument();
Iosers iosers=new Adapter(foreignDocument);
iosers.readCNDoc();
iosers.readENDoc();
}
适配器是通过构造器的方式进行传入英文文档对象,然后,将英文文档对象作为属性,通过属性来调用读英文文档的方法。这样实现了菜鸟接口的适配器就为菜鸟接口实现了读中文文档和英文文档的能力。从而使菜鸟有了读英文文档的能力。
(读英文文档的能力是适配器通过出生(初始化)时就赋予了读英文文档的能力)
--------------------------------------------------------------------------------
总结:
①类的适配器:将一个类(原类)转成满足另一个接口(目标接口)的新类(适配器类),就创建一个适配器类实现目标接口,继承原类。
②对象的适配器:将一个对象(原对象)转成满足新接口(目标接口)的新对象(适配器对象),就使新对象持有原对象,将原对象作为属性,通过原对象调用原对象的方法。