什么适配器设计模式呢?
现在有接口A,客户类的请求这个接口。但是我们希望客户调用的是接口A和接口B,但是这个过程对客户类是透明的。需要造一个适配器,使由于接口不兼容而不能交互的类可以一起工作。
下面是实现的例子:
//鸭子接口 public interface Duck { public void quack(); public void fly(); }
//鸭子实现类 public class MallardDuck implements Duck { public void quack() { System.out.println("Quack"); } public void fly() { System.out.println("I'm flying"); } }
//火鸡接口 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 DuckTestDrive { public static void main(String[] args) { //分别创造鸭子和火鸡对象 MallardDuck duck = new MallardDuck(); WildTurkey turkey = new WildTurkey(); //让鸭子作出动作 System.out.println(" The Duck says..."); testDuck(duck); //让火鸡作出动作 System.out.println("The Turkey says..."); turkey.gobble(); turkey.fly(); /**这时候我想统一地用testDuck这个静态方法控制鸭子和火鸡 * 于是我创造一个适配器来把火鸡嫁接到鸭子接口上去,但是这个过程对用户是透明的 * 用户还是只调用鸭子的静态方法,实际打印的是火鸡的动作 */ Duck turkeyAdapter = new TurkeyAdapter(turkey); System.out.println(" The TurkeyAdapter says..."); testDuck(turkeyAdapter); } static void testDuck(Duck duck) { duck.quack(); duck.fly(); } }
补上适配器类:
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(); } } }
总结:
客户认为他正在和鸭子沟通,目标是鸭子类,是客户在其上调用方法的类。通过扩展两个几口(鸭子和火鸡),适配器使得火鸡可以响应对鸭子的请求。或积累没有鸭子的方法,但是适配器可以将对鸭子方法调用,转接调用火鸡方法。