适配器模式
前言
将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
模式中的角色:
- 目标接口:客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。
- 需要适配的类:需要适配的类或适配者类。
- 适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。
一、类适配器
1.目标接口
/**
* 目标抽象角色
*/
public interface Job {
public abstract void speakJapanese();
public abstract void speakEnglish();
public abstract void speakFrench();
}
2.需要适配的类
/**
* 源角色
*/
public class Person {
private String name ;
private String sex;
private int age;
public void speakJapanese(){
System.out.println("I can speak Japanese!");
}
public void speakEnglish(){
System.out.println("I can speak English!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3.适配器
/**
* 类适配器
*/
public class Adapter extends Person implements Job{
@Override
public void speakFrench() {
System.out.println("I can speak French!");
}
}
类适配器用于单一源的适配,由于它的源的单一化,代码实现不用写逻辑,很清晰。
二、对象适配器
/**
* 对象适配器
*/
public class Adapter2 implements Job {
Person person = new Person();
@Override
public void speakJapanese() {
person.speakJapanese();
}
@Override
public void speakEnglish() {
person.speakEnglish();
}
@Override
public void speakFrench() {
System.out.println("I can speak French!");
}
}
对象的适配模式则可以用于多源的适配,弥补了类适配器的不足,使得原本用类适配模式需要写很多适配器的情况不复存在,缺点是,由于源的数目可能比较多,具体实现的分支也较多,不太清晰。
适用场景
• 工作中的场景
– 经常用来做旧系统改造和升级
– 如果我们的系统开发之后再也不需要维护,那么很多模式都是没必要的,但是不幸的是,事实却是维护一个系统的代价往往是开发一个系统的数倍。
• 我们学习中见过的场景
– java.io.InputStreamReader(InputStream)
– java.io.OutputStreamWriter(OutputStream)