结构型模式之桥接模式
1. 简介
桥接模式(Bridge Pattern)又叫接口模式(Interface Pattern)。桥接模式主要是说将实现和抽象放在两个不同的类层次中,使两个层次可以独立改变。
桥接模式基于类的最小设计原则,通过使用封装、聚合、继承等行为让不同类承担不同的责任。
主要特点是将抽象和行为实现分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
简单来说,就是从多个维度考虑设计一个类时,可以将每个维度抽象出来形成一个接口或者是抽象类,最后再以组合的形式将接口的实现类组合在一起。
2. 举例说明
场景描述:
我们设计手机类时,需要考虑两个维度,一个是手机的类型,是否是翻盖还是全屏;一个是手机的品牌,是否是小米或者是华为等其他品牌。
2.1 原始设计
如果设计手机类把类型和品牌同时考虑进去,那么就会有华为翻盖手机、小米翻盖手机、华为全屏手机、小米全屏手机四个类,当我们需要扩展其他品牌时,势必要将每种类型都要在遍历一遍,这样很容易形成类爆炸的问题。
2.2 桥接模式设计
桥接模式就是将抽象和实现放在两个不同的类层次中,比如说我们将小米翻盖手机类抽象化,将小米品牌抽象成接口,将翻盖类型抽象成接口,最后将两者以组合的形式进行聚合到一起。最终形成一种品牌可以绑定任意一种类型的手机的产品。
2.3 代码演示
package com.inconspicuousy.pattern.bridge;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
// 将手机类型抽象化成抽象类
@Getter
@Setter
abstract class PhoneType {
private String type;
public PhoneType(String type) {
this.type = type;
}
}
// 折叠类型手机
@ToString
class FoldPhone extends PhoneType {
public FoldPhone(String type) {
super(type);
}
}
// 全屏手机
@ToString
class TouchPhone extends PhoneType {
public TouchPhone(String type) {
super(type);
}
}
// 手机品牌
@Getter
@Setter
abstract class BoardPhone {
protected String name;
// 以组合的形式将多维度特点结合起来形成一个新的产品
private PhoneType phoneType;
public BoardPhone(String name, PhoneType phoneType) {
this.name = name;
this.phoneType = phoneType;
}
}
// 小米品牌手机
@ToString
class MiPhone extends BoardPhone {
public MiPhone(String name, PhoneType phoneType) {
super(name, phoneType);
}
}
// 华为品牌手机
@ToString
class HWPhone extends BoardPhone {
public HWPhone(String name, PhoneType phoneType) {
super(name, phoneType);
}
}
/**
* 桥接模式-手机示例代码测试
* @author peng.yi
*/
public class PhoneTest {
public static void main(String[] args) {
FoldPhone foldPhone = new FoldPhone("折叠手机");
TouchPhone touchPhone = new TouchPhone("全屏手机");
// 我们可以通过组合的形式创建各种 品牌和类型 的手机对象
MiPhone miPhone = new MiPhone("小米", foldPhone);
HWPhone hwPhone = new HWPhone("华为", foldPhone);
// 当我们添加苹果品牌时, 只需要添加ApplePhone类继承对应的BoardPhone抽象类, 我们就可以实现对应的功能。
}
}
3. 优点
- 提升了系统的可扩展性,对任一一个维度进行扩展时,只需要添加对应的实现类即可。
- 解决了原始类爆炸的问题。