先上张无聊时画的草图
最近iphone7上市,最大的改动就是取消了3.5mm的耳机,改用lighting接口,并提供3.5mm转lighting转换器,忽然让我想到了设计模式,适配器模式。
适配器模式类图如下:
适配器模式即是将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
如第一张图所示,3.5mm耳机即是被适配的对象,转换器即是适配器,lighting接口即是目标接口。
适配器模式实现方式有两种,一种是类的适配,另一种是对象的适配。
类的适配:
/** * 目标接口(iphone lighting接口) */ public interface Target { /** * 接口 */ public void lighting(); }
/** * 被适配的对象(3.5mm耳机) */ public class Adaptee { public void Ear3_5(){ System.out.println("3.5mm接口耳机插入"); } }
/** * 适配器(3.5-lighting转换器) */ public class Adapter extends Adaptee implements Target{ @Override public void lighting() { super.Ear3_5(); System.out.println("转成lighting,接入iphone"); } }
/** * Client(iPhone 7) */ public class Client { public static void main(String[] args) { // 3.5耳机 Adaptee adaptee = new Adaptee(); adaptee.Ear3_5(); System.out.println("接入适配器"); // 适配器 Adapter adapter = new Adapter(); adapter.lighting(); } }
结果如下:
3.5mm接口耳机插入
接入适配器
3.5mm接口耳机插入
转成lighting,接入iphone
对象适配器模式:
/** * 适配器(3.5-lighting转换器) */ public class Adapter implements Target{ private Adaptee adaptee; public Adapter(Adaptee adaptee){ this.adaptee = adaptee; } @Override public void lighting() { adaptee.Ear3_5(); System.out.println("转成lighting,接入iphone"); } }运行结果一样:
3.5mm接口耳机插入
接入适配器
3.5mm接口耳机插入
转成lighting,接入iphone
总结:
适配器模式在生活中应用十分广泛,它的优点是解决了不同系统的接口相互调用,实现了代码的复用,解耦。
缺点是实现过程比较复杂。