本文出自 http://blog.csdn.net/shuangde800
生活中的适配器
在现实生活中,如果你需要在欧洲国家使用美国制造的笔记本电脑,那么你可能需要使用一个交流电的适配器。
因为欧洲的插座和美国笔记本电脑的插头不一样,所以需要一个交流电适配器,通过这个美国笔记本插头就可以使用欧洲插座了。
OO适配器和真实世界的适配器扮演着同样的角色:将一个接口转换成另一个接口,以符合客户的期望。
第一个适配器模式
有一个鸭子接口:
// 有呱呱叫和飞行的功能
public interface Duck {
public void quack();
public void fly();
}
public class MallardDuck implements Duck {
public void quack() {
System.out.println("呱呱");
}
public void fly() {
System.out.println("我在飞");
}
}
还有一个火鸡的接口:
public interface Turkey {
public void gobble();
public void fly();
}
实现一个野生火鸡:
public class WildTurkey implements Turkey {
public void gobble() {
System.out.println("Gobble gobble");
}
public void fly() {
System.out.println("I'm flying a short distance");
}
}
假设你缺少一个鸭子对象,想用火鸡对象来冒充,可以吗?
显而易见,因为火鸡的接口不同,所以不能公然拿来用
那就写一个适配器吧!
// 需要实现想转换成的类型接口
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turykey;
}
public void quack() {
turkey.gobble();
}
public void fly() {
// 火鸡飞行比较短,所以连飞5次
for(int i = 0; i < 5; ++i) {
turkey.fly();
}
}
}
然后就可以把火鸡通过适配器给鸭子的引用使用了!
public class DuckTestDrive {
public static void main(String[] args) {
MallardDuck duck = new MallardDuck();
WildTurkey turkey = new WildTurkey();
Duck turkeyAdapter = new TurkeyAdapter(turkey);
System.out.println("The Turkey says...");
turkey.gobble();
turkey.fly();
System.out.println("\nThe Duck says...");
testDuck(duck);
System.out.println("\nThe TurkeyAdapter says...");
testDuck(turkeyAdapter);
}
static void testDuck(Duck duck) {
duck.quack();
duck.fly();
}
}
定义适配器模式
适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
1、 适配器模式可以让不兼容的接口变成兼容的。
2、让客户从实现的接口解耦
3、适配器模式充满着良好的OO设计原则:使用对象组合,以修改的接口包装被适配者。这种方法还有额外的有点,被适配者的任何子类,都可以搭配着适配器使用4、这个模式是如何把客户和接口绑定起来,而不是和实现绑定起来的。
适配器分为两种:
1、对象适配器
2、类适配器
类适配器需要多重继承才能实现它,在Java中是不可能的。但是在使用多重继承语言,还是可能遇到这种续期的。
下面是类适配器的类图:
对象适配器的类图:
类适配器和对象适配器的差别在于使用两种不同的适配方法,类适配器是用继承,而对象适配器是用组合。