至诚之道,可以前知
一,定义
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器模式在我们的开发中使用率极高,ListView,GridView,RecyclerView等都使用了适配器模式,它其实就是将两个不兼容 的类融合在一起,它有点像粘合剂,将不同的东西通过一种转换使得他们能够协作起来。
二,使用场景
1,系统需要使用现有的类,而此类的接口不符合系统的需要,即接口不兼容
2,想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作
3,需要一个统一的输出接口,而输入端的类型不可预知
三,角色介绍
1,Target: 目标角色,也就是所期待得到的接口。注意:在类适配器模式中,目标不可以是类
2,Adaptee:现在需要适配的接口
3,Adapter:适配器角色,也是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类
四,类适配器模式的使用
玩过和平精英吃鸡手游的玩家都知道,大家都是在手机或者平板电脑上面用手搓者玩的,这更适合那些没玩过射击游戏的新手玩家,但是对于大多数端游老玩家来说,手搓很不习惯,于是王座就诞生了,它可以让玩家通过键鼠模拟手搓在手机或者平板上操作游戏,这里我们就可以把王座看作是适配器角色,目标角色就是键鼠操作游戏,Adaptee角色就是手搓操作游戏。
创建一个目标角色接口使用键鼠玩游戏:
public interface KeyMouse {void playGameByKM();
}
创建一个适配器角色,王座,可以通过王座玩游戏:
public class Adapter extends Hand implements KeyMouse{@Overridepublic void playGameByKM() {System.out.println("使用键鼠输入操作信号");System.out.println("使用王座将键鼠操作信号转换成模拟手指操作信号");playGameByHand();}
}
创建一个被适配的角色,手搓玩游戏:
public class Hand {public void playGameByHand(){System.out.println("通过手搓玩游戏");}
}
使用:
Adapter adapter =new Adapter();
adapter.playGameByKM();
输出:
这样就可以通过王座玩吃鸡了。
五,对象适配器模式的使用
与类适配器模式一样,对象的适配器模式把被适配的类的API转换成为目标类的API,与类的适配器模式不同的是,对象的适配器模式不是使用继承关系连接到Adapter类,而是使用代理关系连接到Adapter类。
还是上面那个吃鸡的例子。
首先还是创建我们的目标接口来使用键鼠玩游戏:
public interface KeyMouse {void playGameByKM();
}
然后创建一个被适配的角色,手搓玩游戏:
public class Hand {public void playGameByHand(){System.out.println("通过手搓玩游戏");}
}
最后创建我们的适配器adapter,王座:
public class KingAdapter implements KeyMouse{private Hand hand;public KingAdapter(Hand hand) {this.hand = hand;}@Overridepublic void playGameByKM() {System.out.println("使用键鼠输入操作信号");System.out.println("使用王座将键鼠操作信号转换成模拟手指操作信号");hand.playGameByHand();}
}
最后在使用时:
KingAdapter adapter =new KingAdapter(new Hand());
adapter.playGameByKM();
输出:
该方式直接将要被适配的对象传递到Adapter中,使用组合的形式实现接口兼容的效果,比类适配器更为灵活,它的另一个好处是被适配对象中的方法不会暴露出来,而类适配器由于继承了被适配对象,因此,被适配对象类的函数在Adapter类中也都含有,这使得Adapter类出现一些奇怪的接口,用户使用成本较高,因此,对象适配器模式更加灵活实用。
六,总结
在实际开发中,特别是在自定义view等情况下,适配器模式的应用非常广泛且具有重大意义。
优点:
1,更好的复用性:系统需要使用现有的类,而次类的接口不符合系统的需要,那么通过适配器模式就可以让这些功能得到更好的复用。
2,更好的扩展性:在实现适配器功能的时候,可以调用自己开发的功能,从而自然的扩展系统的功能。
缺点:过多的使用适配器,会让系统非常凌乱,不易整体把握。例如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此,如果不是很有必要,可以不适用适配器,而是直接对系统进行重构。