1.引子
适配器:如果需要在欧洲国家使用美国制造的笔记本,可能需要使用一个交流电的适配器,将欧洲110V的交流电转换成美国220V的交流电。因而,适配器工作起来就像一个中间人,将客户所发出的请求转换成厂商类能理解的请求。
2.定义
将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
3.理解定义
- 适配器模式可以通过创建适配器进行接口转换,让不兼容的接口变成兼容。
- 适配器模式可让客户从现实的接口解耦。如果在一段时间之后,我们想要改变接口,如果不用适配器,就必须改写客户端的代码来调用这个新的接口,将会花费大量的时间。适配器可以将改变的部分封装起来,客户就不必为了应对不同的接口而每次跟着修改。
4.将火鸡适配为鸭子
/* * 鸭子接口 */ public interface Duck { public void quack();//鸭子呱呱叫 public void fly(); }
//火鸡接口 public interface Turkey { public void gobble();//火鸡咯咯叫 public void fly(); }
//具体火鸡类,实现接口 public class WildTurkey implements Turkey { @Override public void gobble() { // TODO Auto-generated method stub System.out.print("Gobble gobble"); } @Override public void fly() { // TODO Auto-generated method stub System.out.println("I,m flying a short distance"); } }
适配器类
//将火鸡适配为鸭子 public class TurkeyAdapter implements Duck { //首先,实现想转换成的类型接口,也就是您的客户所期望看到的接口。 Turkey turkey; public TurkeyAdapter(Turkey turkey) //接着,需要取得要适配对象的引用,利用构造器取得这个引用。 { this.turkey = turkey; } //实现接口中的所有方法,quack在类之间转换很简单,只要调用gobble()方法就可以了 //即将火鸡的“咯咯叫”转为鸭子的“呱呱叫” @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(); } } }
客户端主程序
public class DuckTest { public static void main(String[] args) { WildTurkey turkey = new WildTurkey(); //火鸡 Duck turkeyAdapDuck = new TurkeyAdapter(turkey); //火鸡适配为鸭子 testDuck(turkeyAdapDuck); //传入适配器(鸭子) } static void testDuck(Duck duck) //客户端方法,他留的是鸭子的接口,并调用它的quack()和fly()方法 { duck.quack(); duck.fly(); } }