1.定义
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
2.使用场景
1.系统需要使用现有的类,而此类的接口不符合系统的要求,即接口不兼容。
2.想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
3.需要一个统一的输出接口,而输入端的类型不可预知。
3.简单实现
用电源接口为例,笔记本电脑一般都是5V电压,但是生活中电压为220V,这时候就需要一个适配器来接口转换。
类适配器模式
//目标角色 interface FiveVolt{ int getVolt5(); } //需要被转化的对象 class Volt220 { int getVolt220(){ return 220; } } //Adapter角色,将220V转换为5V class AdapterVolt extends Volt220 implements FiveVolt{ @Override public int getVolt5() { return 5; } } public class AdapterMode { public static void main(String[] args){ AdapterVolt adapterVolt = new AdapterVolt(); System.out.println("电压:" + adapterVolt.getVolt5()); } }
对象适配器模式
//目标角色 interface FiveVolt{ int getVolt5(); } //需要被转化的对象 class Volt220 { int getVolt220(){ return 220; } } //Adapter角色,将220V转换为5V class AdapterVolt implements FiveVolt{ Volt220 volt220; public AdapterVolt(Volt220 volt220) { this.volt220 = volt220; } public Volt220 getVolt220() { return volt220; } @Override public int getVolt5() { return 5; } } public class AdapterMode { public static void main(String[] args){ AdapterVolt adapterVolt = new AdapterVolt(new Volt220()); System.out.println("电压:" + adapterVolt.getVolt5()); } }
对象适配器模式直接将要被适配的对象传递到Adapter中,使用组合的形式实现接口兼容的效果。这比类适配器要更灵活,它的另一个好处是被适配对像中的方法不会暴露出来,而类适配器由于继承了被适配对象,因此在Adapter中也有被适配类对象的方法,会出现一些奇怪的接口,增加使用成本,因此对象适配模式更加灵活实用。
4.小结
优点:
更好的复用性、更好的拓展性
缺点:
过多使用适配器会让系统凌乱,不易把握整体。