当前位置: 首页 > article >正文

桥接模式

桥接模式

桥接模式(Bridge Pattern)将抽象部分与它的实现部分分离,使它们都可以独立地变化。这种模式有助于减少类的数量,因为它将一个类层次结构中的两个维度(例如,抽象和实现)解耦,使得两者可以独立地扩展。

桥接(Bridge)模式包含以下主要角色:

  • 系统设计期间,如果这个类里面的一些东西,会扩展很多,这个东西就应该分离出来
  • 抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
  • 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
  • 实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。

案例

现在我们需要销售手机,但不同的手机品牌会有不同的销售渠道,我们需要将销售渠道从手机类中分离出来:

抽象手机类:

public abstract class AbstractPhone {
    AbstractSale sale;

    public void setSale(AbstractSale sale){
        this.sale = sale;
    }
    public abstract void getPhone();
}

抽象销售渠道类:

public class AbstractSale {
    String type;
    String price;
    public AbstractSale(String type,String price){
        this.price = price;
        this.type = type;
    }
    public String getSaleInfo(){
        return "销售渠道:"+this.type + ",销售价格:"+this.price;
    }
}

手机实现类:

public class Iphone extends AbstractPhone{
    @Override
    public void getPhone() {
        System.out.println(sale.getSaleInfo());
    }
}
public class MiPhone extends AbstractPhone{
    @Override
    public void getPhone() {
        System.out.println(sale.getSaleInfo());
    }
}

不同的销售渠道:

public class OffSale extends AbstractSale{
    public OffSale(String type, String price) {
        super(type, price);
    }
}
public class OnSale extends AbstractSale{
    public OnSale(String type, String price) {
        super(type, price);
    }
}

测试:

public class Main {
    public static void main(String[] args) {
        Iphone iphone = new Iphone();
        iphone.setSale(new OffSale("线下","9999"));
        iphone.getPhone();

        MiPhone miPhone = new MiPhone();
        miPhone.setSale(new OnSale("线上","1999"));
        miPhone.getPhone();
    }
}

使用场景用:

  • 当一个类存在两个独立变化的维度,且这两个维度都需要进行扩展时。
  • 当一个系统不希望使用继承或因为多层次继承导致系统类的个数急剧增加时。
  • 当一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性时。

http://www.kler.cn/news/322657.html

相关文章:

  • 【区块链快速概览】了解区块链的基本原理、共识机制(如PoW, PoS)、加密技术基础。
  • uWsgi找不到新安装的python模块问题【亲测好用】
  • 通过 Xshell 无法连接到 Ubuntu
  • HarmonyOS鸿蒙开发实战( Beta5.0)Web组件预览PDF文件实现案例
  • 简历信息提取系统源码分享
  • Postman如何测试WebSocket接口!
  • 企业内训|大模型/智算行业发展机会深度剖析-某数据中心厂商
  • 设备管理系统-TPM(PC+APP/PDA全流程)高保真Axure原型 源文件分享
  • keepalived+nginx实现高可用的案例详解(主主模式)
  • 以题为例浅谈反序列化漏洞
  • 点餐小程序实战教程12菜品展示
  • 记一次 RabbitMQ 消费者莫名消失问题的排查
  • 【洛谷】AT_abc178_d [ABC178D] Redistribution 的题解
  • 摒弃“流量思维”,以精准流量驱动企业发展——基于开源 AI 智能名片、链动 2+1 模式及 O2O 商城小程序的思考
  • 【JavaScript】尾递归优化
  • en造数据结构与算法C# 之 二叉排序树的删除
  • 哪个快?用300万个图斑测试ArcGIS Pro的成对叠加与经典叠加
  • Spring Task快速入门
  • Autosar学习----AUTOSAR_SWS_BSWGeneral(七)
  • 【GUI设计】基于Matlab的图像特征提取GUI系统(9),matlab实现
  • Win10 QT 配置Android开发环境-jdk/sdk/gradle
  • excel数据常用函数学习记录
  • 0基础跟德姆(dom)一起学AI 数据处理和统计分析05-Pandas数分入门
  • overlayscrollbars使用
  • 【JavaEE精炼宝库】HTTP | HTTPS 协议详解
  • react crash course 2024(7) react router dom
  • 精选10个热门目标检测数据集
  • 基于QT的C++中小项目软件开发架构源码
  • oracle生成时间戳字符的两种方法
  • 教师管理系统小程序+ssm论文源码调试讲解