设计模式(六):适配器模式
一、概念
适配器模式,讲一个类的接口转换为客户希望的另外一个接口,它使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。简单地说,就是需要的东西就在面前,但却不能使用,而短时间又无法改造它,于是我们就想办法适配它。
二、实现
大家都知道姚明吧?NBA里的中国球星,实力没得说,那我们今天就由他迁出适配器模式的话题;姚明一开始进入NBA,肯定是听不懂中文的,那么他要和教练和球员沟通,怎么办?有两种解决办法:
- 姚明花大量时间去学英文,但是会耽误了比赛和训练,额,貌似不行
- 让他的教练和队员都去学中文,呃呃,貌似比上面一种还离谱
于是乎,他就请了一位翻译,这位翻译,就是适配器,但是为了比较,我们先不用翻译(适配器),让姚明先交流一下下。。。
1.定义一个Player运动员抽象类,里面定义attack(进攻)和defense(防守)方法
public abstract class Player {
protected String name;
public Player(){
this.name=name;
}
public abstract void attack();
public abstract void defense();
}
2.再分别定义Fowards(前锋)、Center(中锋)、Guards(后卫),都继承Player抽象泪,并重新里面的方法
public class Fowards extends Player {
private String name;
public Fowards(String name){
this.name=name;
}
@Override
public void attack() {
System.out.println("前锋"+name+"进攻");
}
@Override
public void defense() {
System.out.println("前锋"+name+"防守");
}
}
//Center(中锋)、Guards(后卫)代码同上,这里就不列出了
3.测试运行
public static void main(String[] args) {
Player p1=new Fowards("巴蒂尔");
p1.attack();
Player p2=new Guards("麦克格雷迪");
p2.attack();
Player ym=new Center("姚明");
ym.attack();//有问题,姚明不懂英文,他只看得懂中文版的进攻
ym.defense();
}
但是上面的逻辑有问题,因为没有翻译,而姚明不懂英文,他只看得懂中文版的进攻,所以此次沟通彻底失败。
如果要改代码的话,我们要把Center(中锋)的方法改掉,但是违背了我们的开放-关闭原则,所以,适配器模式发挥上了用场
-
我们不要修改Center,而只需要再添加一个ForeignCenter(外籍中锋),两个方法是中文的
//两个方法是中文的 public class ForeignCenter { private String name; public ForeignCenter(String name){ this.name=name; } public void 进攻() { System.out.println("前锋"+name+"进攻"); } public void 防守() { System.out.println("前锋"+name+"防守"); } }
-
再定义Translator类,继承于Player,在实现Player的两个方法里,调用ForeignCenter的进攻、防守方法
public class Translator extends Player { private ForeignCenter foreignCenter; public Translator(String name){ foreignCenter =new ForeignCenter(name); } @Override public void attack() { foreignCenter.进攻(); } @Override public void defense() { foreignCenter.防守(); } }
-
最后,我们来测试
public static void main(String[] args) { Player ym=new Translator("姚明"); ym.attack(); ym.defense(); }
三、总结
适配器模式包含如下角色:
- Target:目标抽象类
- Adapter:适配器类
- Adaptee:适配者类
- Client:客户类
适配器就是一种适配中间件,它存在于不匹配的二者之间,用于连接二者,将不匹配变得匹配,简单点理解就是平常所见的转接头,转换器之类的存在。