其实我感觉这个模式是最简单的一个设计模式了,看着名字可能不明白,其原来就是一个接口。比如电脑的USB接口,内部不管外部插得什么设备只要连接USB,内部都能接收到信号,原因就是两设备之间多了个桥梁------USB。
适配器模式:将一个类的接口转换成客户希望的另一个接口。它使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
<<大话设计模式>>是以NBA球员在外国培训不懂外语,而需要翻译者来帮其翻译,那这个翻译者就是接口了。好啰嗦啊,还是用代码解释一切,因为程序员就是活在代码的世界里。
1、运动员抽象类
/**
* @author jzhf
* 2014-11-05
*/
public abstract class Player {
public String name;
public abstract void attack();//进攻
public abstract void defense();//防守
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
2、前锋类
public class Forward extends Player {
public Forward(String name){
super.name = name;
}
/* (non-Javadoc)
* @seecom.test.model.adapter.Player#attack()
*/
@Override
public void attack() {
// TODO Auto-generatedmethod stub
System.out.println(name+"前锋攻击");
}
/* (non-Javadoc)
* @seecom.test.model.adapter.Player#defense()
*/
@Override
public void defense() {
// TODO Auto-generatedmethod stub
System.out.println(name+"前锋防守");
}
}
3、防守类
/**
* @author jzhf
* 2014-11-05
* 注意不再继承player类,因为需要翻译
*/
public class ForeignCenter{
public String name;
public void attack() {
// TODO Auto-generatedmethod stub
System.out.println(name+"外籍中锋攻击");
}
public void defense() {
// TODO Auto-generatedmethod stub
System.out.println(name+"外籍中锋防守");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
4、翻译者类
/**
* @author jzhf
* 2014-11-05
* 翻译者作为player与外籍队员的接口,所以翻译者应该继承player,但是执行的动作还是外籍球员的动作
*/
public class Translator extends Player {
private ForeignCenter center = new ForeignCenter();
public Translator(String name){
center.setName(name);
}
/* (non-Javadoc)
* @seecom.test.model.adapter.Player#attack()
*/
@Override
public void attack() {
// TODO Auto-generatedmethod stub
center.attack();
}
/* (non-Javadoc)
* @seecom.test.model.adapter.Player#defense()
*/
@Override
public void defense() {
// TODO Auto-generatedmethod stub
center.defense();
}
}
5、客户端
public class AdapterClient {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generatedmethod stub
Player player1 = new Forward("巴蒂尔");
player1.attack();
player1.defense();
Player player2 = new Translator("姚明");
player2.attack();
player2.defense();
}
}
翻译者就是外国语姚明的中间人,为了让姚明听懂外语就需要这样的接口还适应外国的环境。这就是适配器模式,简单吧!
总结:适配器模式简单的说就是需要的东西就在面前,但却不能使用,而短时间又无法改造它,于是我们就想办法适配它。当我们使用一个已经存在的类,但如果它的接口,也就是它的方法和你的要求不相同时,就应该考虑用适配器模式了。