Java设计模式总结(一)适配器模式

图片来自《Java设计模式》第2版

适配器模式

1、类适配器模式

类适配器模式继承自现有的类,同时实现目标接口。
Java设计模式总结(一)适配器模式

类适配器模式:ExistingClass 是已实现的类,而和提供的接口不符合,ExstingClass 提供的是usefulMethod(),接口要求的是requiredMethod(),在不修改ExistingClass的前提下,这时可以通过适配器模式,让NewClass实现接口,并继承ExistingClass,在实现requiredMethod方法时调用usefulMethod方法即可。
Java设计模式总结(一)适配器模式
利用类适配器模式,在不修改PhysicalRocket的前提下,将PhysicalRocket适配到RocketSim接口,OozinozRocket需实现setSimTime。

2、对象适配器模式

对象适配器模式继承自目标类,同时引用现有的类。
Java设计模式总结(一)适配器模式
对象适配器模式,适用于没有接口可以实现的情况,在内部创建ExistingClass实例对象使用委托方式调用其方法。
这种方式适用于适配虚类。

Java设计模式总结(一)适配器模式
OozinozSkyrocket 通过在内部添加PhysicalRocket实例的方式,来适配Skyrocket。
该种方式有一定的缺点,和接口适配相比,如果Skyrocket方法有变化,如将getMass变为getAllMass,那么OozinozRocket无法在编译时检查到错误,只有运行才发现没适配上(如果用@OverRide注解可以避免这个问题)。而接口则省力的多,未实现对应的方法编译时就会警告。此外,若需要直接使用父类的属性,也有不是protected的风险,但一般都有get/set方法,问题不大。
Java设计模式总结(一)适配器模式
swing 中 TableModle使用了对象适配器模式。