Java 设计模式04 适配器模式
1 适配器模式 简介
适配器模式(有时候也称包装样式或者包装)将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
1.1 适配器模式 模式
- 对象适配器模式
在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。 - 类适配器模式
这种适配器模式下,适配器继承自已实现的类(一般多重继承)。
1.2 适配器模式 优点
- 类适配器模式
由于适配器adapter类是适配者adaptee类的子类,因此可以在适配器类中置换一些适配者的方法,即Override(重写),使得适配器的灵活性更强。 - 对象适配器模式
一个对象适配器可以把多个不同的适配者adaptee适配到一个目标,也就是说,同一个适配器可以将适配者类和它的子类都适配到目标接口。
1.2 适配器模式 缺点
- 类适配器模式
java8之前:接口没有default方法,就是没有实现了具体逻辑的方法,而且不支持类多继承,所以适配者类只能有一个。
java8之后:接口有了default方法,接口中的方法有了实现,因为接口是多继承的,所以适配者可以是多个带有default方法的接口,但是接口是不可以实例化的,实际上没有什么意义。有个解决方法就是,接口里都是default方法,实现接口的类什么也没做,就是提供一个可以实例化的类。这样的化,类适配器模式中适配者adapter类就可以适配多个适配者adaptee类了。这个解决方法只是我理论上论证一下,实际上可行与否,请自行判断验证。 - 对象适配器模式
类适配器模式的优点就是对象适配器模式的缺点,不能置换适配者类的方法。如果想修改适配者类的一个或多个方法,就只好先创建一个继承与适配者类的子类,把适配者类的方法置换掉,然后把适配者的子类当做真正的适配者进行适配,实现过程较为复杂。
2 适配器模式 UML 图
角色 | 名称 | 功能 |
---|---|---|
目标抽象类 | Target | |
适配器类 | Adapter | |
适配者类 | Adaptee | |
客户类 | Client |
3 适配器模式 实现
2.1 目标抽象类
package com.xu.modle.mode2;
/**
* 目标抽象类
* @author hyacinth
* @date 2019年10月12日12:30:09
*
*/
public interface Target {
/**
* 目标抽象类
* @return Java 数据库 连接方式
*/
public String JDBC();
}
2.2 适配器类
package com.xu.modle.mode2;
/**
* 适配器类
* @author hyacinth
* @date 2019年10月12日12:30:09
*
*/
public class Adapter extends Adaptee implements Target {
@Override
public String JDBC() {
String jdbc = connection();
System.out.println("适配器 默认数据库连接方式:"+jdbc);
jdbc = "MySQL";
System.out.println("适配器 修改数据库连接方式:"+jdbc);
return jdbc;
}
}
2.3 适配者类
package com.xu.modle.mode2;
/**
* 适配者类
* @author hyacinth
* @date 2019年10月12日12:30:09
*
*/
public class Adaptee {
private String jdbc = "Java";
public String connection() {
System.out.println("默认数据库连接方式:"+jdbc);
return jdbc;
}
}
2.4 客户类
package com.xu.modle.mode2;
public class Client {
public static void main(String[] args) {
Target target = new Adapter();
System.out.println(target.JDBC());
}
}