适配器模式
把一个类的接口变化成客户端所期待的另一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器模式有两种形式:类适配器、对象适配器
对象适配器
类的适配器模式把适配的类的API转换成为目标类的API。
通过继承来实现适配器功能
比如:如果我们笔记本上的网线插口坏掉了,网线接口又没有办法与usb接口连接,是不是要买个usb转换器(适配器),通过转换器使网线和电脑连接。
源码:
public interface 网线接口{ void is网线接口(); }public interface USB接口 { void USB接口(); }
public class USB接口实现 implements USB接口 { @Override public void isUSB接口() { System.out.println("USB口"); } }
public class 适配器 extends USB接口实现 implements 网线接口 { @Override public void is网线接口() { isUSB接口(); } }
public class Clienter { public static void main(String[] args) { 网线接口 p = new 适配器(); p.is网线接口(); } }
输出:USB口
接口适配器模式
原理:通过抽象类来实现适配,这种适配稍别于上面所述的适配。
比如:爱好接口有吃饭,睡觉,打豆豆。每个企鹅都要实现这三个爱好接口,可是名为豆豆的企鹅怎么办尼,自己打自己岂不是傻了,那么豆豆如何不用实现这个打豆豆接口。
源码:
public interface Hobby {
void 吃饭();
void 睡觉();
void 打豆豆();
}
public abstract class 适配器 implements Hobby { public void 吃饭(){} public void 睡觉(){} public void 打豆豆(){} }public class 企鹅 extends 适配器{ public void 吃饭(){ System.out.println("开饭了"); } public void 睡觉(){ System.out.println("吃饱了睡觉"); } }测试public class Clienter { public static void main(String[] args) { Hobby a = new comeTrue(); a.吃饭(); a.睡觉(); } }
输出:开饭了 吃饱了睡觉
适配器模式的优点
更好的复用性
系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。 更好的扩展性
在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
适配器模式的缺点
过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。