一、概念
适配器模式:将一个类的接口适配成用户所期待的。也就是定义一个外界希望的接口,从而使因为不兼容而不能在一起工作的那些类在一起工作。通常的做法是将类自己的接口包裹在一个已存在的类中。在软件开发中,如果希望复用某些类,但是需要复用的类与环境不兼容时需要采用适配器模式,具体的说也就是当前系统的行为与数据都正确但是接口不符合就需要使用适配器模式。
二、两类适配器模式
(1)对象适配器模式:在这种适配器模式中,适配器容纳一个它包裹的类的实例,即适配器调用被包裹对象的实体
(2)类适配器模式:在这种适配器模式下,适配器继承自己实现的类
三、应用举例(参考网址)
在NBA比赛中,如果一个外籍球星加入NBA,而他又不懂英语,而且在短期学会英语也不是一件易事,NBA的其他球员也不懂他的语言,那么在这种情况下,最好的选择当然是找一个翻译比较省事了。而这个翻译就是这里提到的适配器了,那么就以NBA外籍球星,比如姚明,加入NBA比赛的场景用代码实现
public class AdapterMode{
//抽象球员类
public abstract class Player{
protected String name;
public Player(){}
public Player(String name){
this.name = name;
}
public abstract void attack();
}
//本土球员
public class NativeNBAPlayer extends Player{
public NativeNBAPlayer(String name){
super(name);
}
public void attack(){
System.out.println("I am native NBA player, I am attacking!");
}
}
//外籍球员
public class ForeignNBAPlayer extends Player{
public ForeignNBAPlayer(){}
public ForeignNBAPlayer(String name){
super(name);
}
public void attack(){
System.out.println("我是中国球星,我在攻击!");
}
}
public class Translator{
private String name;
private Player foreignNBAPlayer;
public Translator(String name,Player foreignNBAPlayer){
this.name = name;
this.foreignNBAPlayer = foreignNBAPlayer;
}
public void translatorAttack(){
foreignNBAPlayer.attack();
}
}
//测试代码
public static void main(String[] args){
AdapterMode am = new AdapterMode();
Player nativeNBAPlayer = am.new NativeNBAPlayer("Kobe");
Player foreignNBAPlayer = am.new ForeignNBAPlayer("姚明");
nativeNBAPlayer.attack();
Translator translator = am.new Translator("翻译官",foreignNBAPlayer);
translator.translatorAttack();
}
}
四、总结
1、适配器模式通过定义一个外界希望的接口使得原来不相关的类可以协同工作;
2、当需要复用的类与复用环境差别较多的时候,可以考虑使用适配器模式;
3、当需要协同工作的双方都不愿修改自身的代码或者双方修改的成本较大的时候,可以考虑使用适配器模式;
4、适配器模式为客户调用提供了一个统一的接口,使得客户的调用更简单更直接更紧凑。