适配器模式
将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
有“两种”适配器:“对象”适配器和“类”适配器。
1)对象适配器:使用对象组合,以修改的接口包装被适配者,被适配者的任何子类都可以搭配着适配器使用。
2)类适配器:使用继承,不需要重新实现整个被适配者。但是需要多重继承才能实现它,这在JAVA中是不可能的。
具体例子
适配者接口:Duck.java
package com.designpattern.adapter;
public interface Duck {
public void quack();
public void fly();
}
适配者:MallardDuck.java
package com.designpattern.adapter;
public class MallardDuck implements Duck{
@Override
public void quack() {
// TODO Auto-generated method stub
System.out.println("Quack!!");
}
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I'm flying!");
}
}
被适配者接口:Turkey.java
package com.designpattern.adapter;
public interface Turkey {
public void gobble();
public void fly();
}
被适配者:WildTurkey.java
package com.designpattern.adapter;
public class WildTurkey implements Turkey{
@Override
public void gobble() {
// TODO Auto-generated method stub
System.out.println("Gobble gobble!");
}
@Override
public void fly() {
// TODO Auto-generated method stub
System.out.println("I'm flying a short distance!");
}
}
适配器实现适配者接口:TurkeyAdapter.java
package com.designpattern.adapter;
public class TurkeyAdapter implements Duck{
Turkey turkey;
public TurkeyAdapter(Turkey turkey){
this.turkey = turkey;
}
@Override
public void quack() {
// TODO Auto-generated method stub
turkey.gobble();
}
@Override
public void fly() {
// TODO Auto-generated method stub
for(int i = 0;i < 5;i++){
turkey.fly();
}
}
}
测试类:Test.java
package com.designpattern.adapter;
public class Test {
public static void main(String[] args) {
MallardDuck duck = new MallardDuck();
WildTurkey turkey = new WildTurkey();
Duck turkeyAdapter = new TurkeyAdapter(turkey);
System.out.println("\nThe Turkey says...");
turkey.gobble();
turkey.fly();
System.out.println("\nThe Duck says...");
duck.quack();
duck.fly();
System.out.println("\nThe TurkeyAdapter says...");//像鸭的火鸡
testDuck(turkeyAdapter);
}
private static void testDuck(Duck duck){
duck.quack();
duck.fly();
}
}
使用过程
1)客户通过目标接口(Duck)调用适配器(TurkeyAdapter)的方法对适配器发出请求。
2)适配器使用被适配者接口(Turkey)把请求转换成被适配者的一个或多个调用接口。
3)客户接收到调用的结果,但并未察觉这一切是适配器在起转换作用。