结构型模式之桥接模式

结构型模式之桥接模式

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. 优点

  • 提升了系统的可扩展性,对任一一个维度进行扩展时,只需要添加对应的实现类即可。
  • 解决了原始类爆炸的问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值