1、问题
桥接模式是将抽象与具体实现进行解耦。它的目的是:
- 当A类依赖于B类时,可以依赖B类的抽象,而不是具体类,从而使得A类和B类可以拥有独立的类体系结构,彼此的变化对双方不存在任何影响。
- 当A类依赖与B类时,B类的具体类型延期到runtime,而不是编译阶段。A类对B类的依赖也可以随意切换到其任意的实现类。
抽象与具体的关系可以理解为对象与对象之间的泛化和实现关系。泛化关系在表现为子类与父类之间的关系。实现表现为接口和实现类之间的关系。
它的核心思想是”解耦”。
2、UML图
为了便于理解,将A类抽象为Person类,B类抽象为Clothes类。
示例中Person类依赖于Clothes(类),以属性的方式注入依赖关系,属性的具体类型延期到运行阶段才可以知晓。
由于Person依赖于Clothes类,而不是依赖于其具体的子类,所以二者的类体系结构可以独立变化,在本例中Person通过性别划分为男女,衣服类通过季节划分为夏装和冬装,当添加秋装,一种新的服装类型时,Person类不受任何影响。
3、代码
Person类
/** * * @File Name: Person.java * @Description: Person类,人的抽象 * @version 1.0 * @since JDK 1.8 */ public class Person { // 人可以有多套衣服,这个属性代表人穿在身上的那套衣服 private Clothes wearClothes; public Person() { } public Person(Clothes clothes) { } // set和get省略 }
Male类和Female类继承Person类,此处省略。
Clothes类,它由上衣,裤子,鞋子三部分组成,类之间存在聚合关系
/** * * @File Name: Clothes.java * @Description: 衣服 * @version 1.0 * @since JDK 1.8 */ public class Clothes { // 外套 private Coat coat; // 裤子 private Pants pant; // 鞋子 private Shoes shoes; // setter和getter,略 }
SummerClothes和WinterClothes直接继承Clothes类即可。此处省略
4、讨论
1. 问题1:适配器的主要功能是什么?
答:适配器的主要功能是对依赖关系的解耦。从上述的示例中可以看到Person类与Clothes之间的变化是独立的,一方的变化不会对另外一方产生影响。
2. 问题2:适配器的应用场景?
答:适配器模式更偏向于一种思想,它是为了解决”解耦”问题而诞生的,而类与类之间存在耦合的情况随处可见。解决它的方式也是依赖抽象,而不是具体类型。可以说这种模式或这种思想在Java编程语言中随处可见。
5、示例
任何注入依赖的Java代码,通过依赖其抽象,而不是具体实现都可以适为本模式的示例。例如最常见的Controller依赖Service。