如果饿了就吃,困了就睡,渴了就喝,人生就太无趣了
1 定义
1.1 概念
将一个类的接口,转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间。
适配器模式就如同它本身的名字一样形象,如图1:现有系统暴露的接口与厂商类的接口不匹配,二者不能结合使用。
现在需要一个适配器来将两个系统结合起来。如图2:
1.2 类图
适配器模式分为两种:对象适配器和类适配器。
- 对象适配器:让适配器类
Adapter
去实现目标接口Target
,适配器类Adapter
和被适配者Adaptee
进行组合。而客户此时只看到目标接口。
- 类适配器:因为java是不支持多继承的,所以在这里把类图放在这仅供参考不做解释了。
2.例子
2.1类图
如图5:有鸭子接口Duck
和火鸡Turkey
接口,有时候需要让火鸡充当鸭子,所以就有了TurkeyAdapter
类实现了Duck
接口,在TurkeyAdapter
中通过调用Turkey
的方法让其适配鸭子接口。也有时候要让鸭子充当火鸡,做法和之前的类似。 MallardDuck
和WildTurkey
分别是Duck
和Turkey
的实例,用来和适配器类做对比。其他两个DuckTestDrive
和TurkeyTestDrive
是测试类。
2.2代码
(1) 火鸡充当鸭子
public interface Duck {
void quack();
void fly();
}
public class MallardDuck implements Duck{
public void quack() {
System.out.println("Quack");
}
public void fly() {
System.out.println("I'm flying");
}
}
public class TurkeyAdapter implements Duck {
Turkey turkey;
public TurkeyAdapter(Turkey turkey) {
this.turkey = turkey;
}
public void quack() {
turkey.gobble();
}
public void fly() {
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();
}
}
(2) 鸭子充当火鸡
public interface Turkey {
void gobble();
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 DuckAdapter implements Turkey{
Duck duck;
Random rand;
public DuckAdapter(Duck duck) {
this.duck = duck;
rand = new Random();
}
public void gobble() {
duck.quack();
}
public void fly() {
if (rand.nextInt(5) == 0) {
duck.fly();
}
}
}
public class TurkeyTestDrive {
public static void main(String[] args) {
MallardDuck duck = new MallardDuck();
Turkey duckAdapter = new DuckAdapter(duck);
for (int i = 0; i < 10; i++) {
System.out.println("The DuckAdapter says...");
duckAdapter.gobble();
duckAdapter.fly();
}
}
}