适配器模式(重要):
又叫包装器,将一个接口转换成另一个用户希望的接口,使得原本不兼容的两个类可以协同工作。既可以作为类结构型模式,又可以作为对象结构型模式。由目标抽象类、适配器类、适配者类、客户类组成,客户类针对目标抽闲类编程,适配器模式更多的是强调对代码的组织,而不是功能的实现。
类适配器模式:适配器类与适配者类是继承关系,适配器类继承适配者类,实现目标抽象接口
对象适配器模式:适配器类与适配者类是关联关系,适配器类关联适配者类,继承目标抽象类
适配器的适用场景:
1.系统要使用现有的类,而这些类的接口不符合系统的需要
2.建立一个可重复使用的类,将这个类与那些不太兼容的类一起工作
适配器的优点:
1.将目标抽象类与适配者类解耦,使用适配器类来重用现有的适配者类,无须修改原有代码
2.将具体的实现封装到适配者类中,增加了类的透明性和复用性,具有良好的灵活性和可扩展性。新增适配器类不需要修改原有代码,符合开闭原则
3.类适配器模式中,适配器类可以覆盖适配者类的一些方法,具有很强的灵活性。对象适配器可以适配多个适配者类。
适配器的缺点:
1.类适配器模式的缺点是不能适配多个适配者类和目标类必须为接口(因为不支持多继承),对象适配器模式的缺点是不能够重写适配者类的方法
适配器的应用:
1.JDBC驱动是介于JDBC接口和数据库引擎接口之间的适配器软件
2.Spring AOP中的BeforeAdvice、AfterAdvice和ThrowsAdvice三种通知类型借助适配器模式来实现,允许用户向框架中加入任何一种自己想要支持的通知类型。
默认适配器模式:当不需要全部实现接口中的所有方法时,可先设计一个抽象类实现该接口,并为接口中的每个方法提供一个默认实现(空方法),这样该抽象类的子类就可以选择地覆盖父类的某些方法来实现需求,适用于一个类不想使用实现的接口中所有方法的情景,也称为单接口适配器模式。
适配者接口:要适配的对象,是一个接口
默认适配器类:是一个实现了适配者接口的抽象类
具体业务类:是默认适配器的子类,有选择地覆盖默认适配器类中的方法
适配器模式的例子(类适配器):模拟数据库引擎和JDBC接口
适配者类(数据库引擎)
public class SqlConnection {
public void sqlStart() {
System.out.println("数据库初始化。。。");
}
public void sqlClose() {
System.out.println("数据库关闭。。。");
}
}
目标抽象接口(JDBC接口)
public interface ConnectDB {
public void start();
public void close();
}
适配器类(mysql JDBC驱动)
public class MysqlAdapter extends SqlConnection implements ConnectDB{
/**
* @Description: TODO
* @author doudou
* @date 2019年10月9日
* @throws
* @return
* @see structural.AdapterPattern.ConnectDB#start()
*/
@Override
public void start() {
sqlStart();
}
/**
* @Description: TODO
* @author doudou
* @date 2019年10月9日
* @throws
* @return
* @see structural.AdapterPattern.ConnectDB#close()
*/
@Override
public void close() {
sqlClose();
}
}