1. 适配器模式:
将一个类的接口转换成用户希望的另外一个接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。适配器模式就类似一个桥梁的作用,把原本不兼容的接口进行合并成为一个类。
2. 适配器模式的类别:
-
类适配器模式:通过继承来实现适配器功能。
-
对象适配器模式:使用类的组合来实现适配器功能。
-
接口适配器模式(缺省适配器模式):增加一个桥梁,来减少工能类中的方法体。(通过抽象类来实现适配)
3. 类适配器
3.1. 类适配器的关系图:
3.2.适配器模式包含的角色:- 目标角色: 期待所能得到的接口。注意:类适配器模式下,目标只能事接口不能是类。
- 源角色: 需要被适配的对象。
- 适配器角色: 适配器角色是本模式的关键。适配器负责把源接口转换为目标接口。这一角色只能是类不能是接口。
3.3. 类适配器模式的示例代码:
场景:现在市面的共享充电器既有type-c接口,又有lighting接口。
目标角色:
public interface Charger {
//typeC接口
void typeCInterface();
//lighting接口
void lightingInterface();
}
源角色:
public class TypeC {
public void typeCInterface(){
System.out.println("我只有TypeC接口....");
}
}
适配器角色:
public class InterfaceAdapter extends TypeC implements Charger {
@Override
public void lightingInterface() {
System.out.println("我有Lighting接口");
}
}
测试主函数:
public class Main {
public static void main(String[] args) {
Charger charger = new InterfaceAdapter();
charger.lightingInterface();
charger.typeCInterface();
}
}
将以上适配器改成对象适配器,只需要修改适配器源码如下:
public class ObjInterfaceAdapter implements Charger {
private TypeC typeC;
public ObjInterfaceAdapter(TypeC typeC) {
this.typeC = typeC;
}
@Override
public void typeCInterface() {
typeC.typeCInterface();
}
@Override
public void lightingInterface() {
System.out.println("我有Lighting接口");
}
}
测试主函数:
public class Main {
public static void main(String[] args) {
Charger charger1 = new ObjInterfaceAdapter(new TypeC());
charger1.typeCInterface();
charger1.lightingInterface();
}
}
类适配器模式与对象适配器模式的区别:
- 类适配器模式是静态的对象集成方式。而对象适配器是使用传入对像的动态组合的方式,灵活性相对较高。
- 由于类适配器是直接集成被适配角色,因此这个适配器就不能去处理被适配器角色的子类。而对象适配器可以把多种不同的源匹配到一个目标中,也就避免了类适配的不能处理被适配角色的子类的问题。
- 相对于类适配器来说,对象适配器新增行为更具灵活方便,所以这里推荐用对象适配器,但是具体情况还是需要具体对待。
5. 接口适配器
在类适配器和对象适配器之外还有一种接口适配器(缺省适配器); 这种适配器模式的主要目的是简化类中的方法,因为如果一个类要去实现接口的情况下,就必须实现接口中所有的方法,有可能会遇到其实只需要使用类中的某几个方法,这样会导致实现类的臃肿,可以通过这种办法来做简化。这种方法的实现其实是使用一个抽象类去实现接口,实现后然后真正使用方法的类则去继承这个抽象类,这样就不需要所有方法都去实现了。
这里使用伪代码进行解释:
接口:
public interface AbsInterface {
void method1();
void method2();
void method3();
void method4();
}
如果我们要使用接口中的方法,如果直接使用实现接口的方式,那么实现的类中就会有很多的方法,显得很臃肿。而我们又只需要其中的method2和method3这个两个方法,那么,只需要再添加一个抽象类去实现这个接口。
抽象类如下:
public abstract class InterAdapter implements AbsInterface {
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
@Override
public void method4() {
}
}
接下来我们只需要去继承这个抽象类,然后从抽象类中调用我们需要的方法即可:
代码如下:
public class Target extends InterAdapter{
@Override
public void method3() {
System.out.println(">>>>>>method3");
}
}
测试主函数:
public class Main {
public static void main(String[] args) {
AbsInterface absInterface = new Target();
absInterface.method3();
}
}
6. 适配器模式的优缺点:
优点:
1. 可以让任何没有联系的两个类一起使用。
2. 对系统中的类有更好的复用性。也就是说如果系统需要使用现有类,但是现有的类又不符合接口的要求,可以使用适配器进行适配,让这些功能得到更好的复用。
3. 提供系统的扩展性.使用适配器可以很简单的调用自己开发的功能,自然而然的扩展系统功能。
缺点:
当然适配器功能的缺点也很明显,过多的适配器会让系统非常凌乱。