适配器模式定义:将一个接口转换为另一个接口,以符合客户的期望
目标接口:Duck
建一个鸭子接口,鸭子具有呱呱叫和飞行的能力。
public interface Duck {
public void quack();
public void fly();
}
具体实现类
public class MallardDuck implements Duck {
@Override
public void quack() {
System.out.println("Quack");
}
@Override
public void fly() {
System.out.println("I am flying");
}
}
原始接口:Turkey
建一个火鸡接口,火鸡只会咕咕叫,会飞但飞不远。
public interface Turkey {
public void gobble();
public void fly();
}
具体实现类
public class WildTurkey implements Turkey{
@Override
public void gobble() {
System.out.println("Gobble gobble");
}
@Override
public void fly() {
System.out.println("I am flying a short distance.");
}
}
建立适配器,将原始接口适配成目标接口
现在,缺鸭子对象,想用一些火鸡对象来冒充,写个适配器,把火鸡对象适配成鸭子。
public class TurkeyAdaptor implements Duck{
Turkey turkey;
public TurkeyAdaptor(Turkey turkey) {
this.turkey = turkey;
}
@Override
public void quack() {
turkey.gobble();
}
@Override
public void fly() {
for (int i = 0; i < 5; i++) {
turkey.fly();
}
}
}
测试代码
public class AdaptorTest {
public static void main(String[] args) {
MallardDuck duck = new MallardDuck();
WildTurkey turkey = new WildTurkey();
Duck turkeyAdaptor = new TurkeyAdaptor(turkey);
System.out.println("The turkey says...");
turkey.gobble();
turkey.fly();
System.out.println("\nThe duck says...");
testDuck(duck);
System.out.println("\nThe turkeyAdaptor says...");
testDuck(turkeyAdaptor);
}
private static void testDuck(Duck duck) {
duck.quack();
duck.fly();
}
}
运行结果:
另一个例子:将枚举适配到迭代器
public class EnumerationIterator implements Iterator {
Enumeration enumeration;
@Override
public boolean hasNext() {
return enumeration.hasMoreElements();
}
@Override
public Object next() {
return enumeration.nextElement();
}
}
总结
适配器模式定义:将一个接口转换为另一个接口,以符合客户的期望。
实现适配器模式的步骤: 1.实现需要转换成的期望的接口 2.在适配器的构造器里,取得适配的对象的引用 3.实现接口的方法
与装饰者模式、外观模式的区别
装饰者模式:不改变接口,但加入责任。 适配器模式:将一个接口,转换为另一个接口。 外观模式:让接口更简单。提供一个统一的接口,用来访问子系统的一群接口。外观定义了一个高层接口,让子系统更容易使用。
|