设计模式之桥梁模式

news2024/11/15 15:29:50

什么是桥梁模式

桥梁模式(Bridge Pattern)也称为桥接模式,属于结构型模式,它主要目的是通过组合的方式建立两个类之间的联系,而不是继承。桥梁模式将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。

桥梁模式的核心角色

桥梁模式的实现通常包括以下四个角色:

  1. Abstraction——抽象化角色:它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。
  2. Implementor——实现化角色:它是接口或者抽象类,定义角色必需的行为和属性。
  3. RefinedAbstraction——修正抽象化角色:它引用实现化角色对抽象化角色进行修正。
  4. ConcreteImplementor——具体实现化角色:它实现接口或抽象类定义的方法和属性。

桥梁模式如何实现

小王是一个富二代,家里的产业很多,开煤矿、搞房地产等等,如果设计一个程序来帮助小王来管理家族产业,那么应该怎么实现呢?这里就可以使用桥梁模式来实现。为什么可以使用桥梁模式呢?原因是这样的,小王家大业大、善于投资,这些产业可能会发生变化,比如煤矿不挣钱了,就改搞新能源;如果房地产不挣钱了,那就搞酒店住宿,可以看出来具体的业务可能会发生变化;那有没有不会发生变化的东西?当然有。这么大的产业,一般会成立一些子公司分别来管理这些产业,然后通过一个母公司来控制这些子公司。

那这里的母公司就是抽象化角色(Abstraction),子公司就是实现化角色(RefinedAbstraction),这些不同的产业可以抽象为产品类,即实现化角色(Implementor),产品有两个共同的行为,被生出来、被销售出去,煤碳、房产等这些就是具体的具体实现化角色(ConcreteImplementor),下面就用代码来演示一个这个过程:

  1. MotherCompany:抽象化母公司,属于抽象化角色(Abstraction)
  2. CoalCompany:煤炭公司袱类,属于实现化角色(RefinedAbstraction)
  3. HouseCompany:房产公司类,继承于MotherCompany,属于具体实现化角色(ConcreteImplementor)
  4. Product:抽象产品类,即实现化角色(Implementor)
  5. House:房产实体类,继承于Product,属于具体实现化角色(ConcreteImplementor)
  6. Coal,煤炭实体类,继承于Product,属于具体实现化角色(ConcreteImplementor)
/**
 * 抽象产品,实现化角色(Implementor)
 */
public abstract class Product {
    /**
     * 被生产出来
     */
    public abstract void  beProduted();

    /**
     * 被销售出去
     */
    public abstract void beSelled();
}
/**
 * 煤炭,具体实现化角色(ConcreteImplementor)
 */
public class Coal  extends Product{
    @Override
    public void beProduted() {
        System.out.println("煤炭生产");
    }

    @Override
    public void beSelled() {
        System.out.println("煤炭销售");
    }
}
/**
 * 房产,具体实现化角色(ConcreteImplementor)
 */
public class House extends Product{
    @Override
    public void beProduted() {
        System.out.println("房产生产");
    }

    @Override
    public void beSelled() {
        System.out.println("房产销售");
    }
}
/**
 * 母公司就是抽象化角色(Abstraction)
 */
public abstract class MotherCompany {
    private Product product;

    public MotherCompany(Product product) {
        this.product = product;
    }

    public void mange(){
        this.product.beProduted();
        this.product.beSelled();
    }
}
/**
 * 煤炭公司,实现化角色(RefinedAbstraction)
 */
public class CoalCompany extends MotherCompany{
    public CoalCompany(Product product) {
        super(product);
    }

    @Override
    public void mange() {
        super.mange();
        System.out.println("今年煤炭生意火爆");
    }
}
/**
 * 房产公司,实现化角色(RefinedAbstraction)
 */
public class HouseCompany extends MotherCompany{
    public HouseCompany(Product product) {
        super(product);
    }

    @Override
    public void mange() {
        super.mange();
        System.out.println("今年房地产生意不好");
    }
}
public class Test {
    public static void main(String[] args) {
        Product product=new Coal();
        MotherCompany motherCompany=new CoalCompany(product);
        motherCompany.mange();
        System.out.println("----------------");
        product=new House();
        motherCompany=new HouseCompany(product);
        motherCompany.mange();
    }
}

如果小王家又新增投资旅游产业,开了一家景点经营公司,怎么办呢?新增一个旅游公司的类、门票类,就可以了,原来的业务不用改,完全符合开闭原则

/**
 * 门票
 */
public class Ticket extends Product {
    @Override
    public void beProduted() {
        System.out.println("印刷门票");
    }

    @Override
    public void beSelled() {
        System.out.println("卖门票");
    }
}
/**
 * 旅游公司
 */
public class TourismCompany extends MotherCompany{
    public TourismCompany(Product product) {
        super(product);
    }

    @Override
    public void mange() {
        super.mange();
        System.out.println("旅游人数爆火");
    }
}
public class Test {
    public static void main(String[] args) {
        Product  product=new Ticket();
        MotherCompany motherCompany=new TourismCompany(product);
        motherCompany.mange();
    }
}

桥梁模式的适用场景

桥梁模式的应用场景包括:

  1. 当你想要解耦抽象和具体类时,例如在软件系统中,抽象和具体的功能经常需要变化,而通过使用桥梁模式,你可以将它们解耦,使得你可以在不改变其他部分的情况下更改它们。
  2. 当你需要实现可扩展的软件系统时,桥梁模式可以帮助你实现更灵活的架构,因为你可以在不影响其他部分的情况下添加新的具体实现。
  3. 当你需要隐藏实现的细节时,桥梁模式可以帮助你隐藏实现的细节,只暴露公共接口,这样客户端只需要和抽象类打交道,不需要关心具体的实现细节。

总结

优点

创建灵活且易于扩展的软件产品、简化客户端代码、易于维护和修改等。

缺点

如增加系统的复杂性和理解难度、需要正确地识别出系统中两个独立变化的维度、需要对系统进行递归处理等。

总的来说,桥梁模式是一种结构型设计模式,它通过将抽象和具体解耦,使得它们可以独立地变化,从而提高了系统的灵活性和可扩展性,但同时也需要仔细考虑和设计才能正确应用。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1141435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python3飞机大战源码(让小白做出第一个飞机大战游戏)

让小白做出第一个飞机大战游戏 配置环境 pip install pygame 安装依赖包 目录层级,在飞机的文件夹下面有2个文件一个是代码文件plan.main一个是图片文件images 下载下面的四张图片,改名字后并放到指定的文件夹中(图片都是png格式&#xff09…

数据库和sql语句

一、数据库和sql语句 (一)数据库的相关概念 1、数据:数据信息。据:属性,对一系列对象的具体属性的描述的集合 2、数据库:用来组织(表示各个数据之间是有关联的,按照规则组织起来&…

【QT】信号和槽能自动传递参数

一、前置示例代码 main.cpp #include "widget.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv); // 应用程序对象a&#xff0c;在Qt中&#xff0c;应用程序对象&#xff0c;有且仅有一个。Widget w; // 窗口对…

2023年09月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 下列 Python 语句能够正确输出"学而时习之"五个字的是&#xff1f;&#xff08; &#xff09; A: print “…

springboot项目打jar包,运行时提示jar中没有主清单属性

可能性一&#xff1a; 没有在pom中加入maven插件 在pom中加入下方代码即可。 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</ve…

电脑定时关机

电脑定时关机 1.右键 管理 2. 3. 4. 5. shutdown.exe/s /f /t 06.点击完成就好了 7.这里面可以 看到定时任务和启动 右键有运行 结束 禁用

【Java 进阶篇】Java Request 继承体系详解

在Java编程中&#xff0c;Request&#xff08;请求&#xff09;是一个常见的概念&#xff0c;特别是在Web开发中。Request通常用于获取来自客户端的信息&#xff0c;以便服务器能够根据客户端的需求提供相应的响应。在Java中&#xff0c;Request通常涉及到一系列类和接口&#…

【Linux】解决缓存锁问题:无法获得锁 /var/lib/dpkg/lock-frontend

今天在运行apt-get update更新软件包后&#xff0c;突然发现安装新的软件出现了这个报错&#xff1a;正在等待缓存锁&#xff1a;无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 1855&#xff08;unattended-upgr&#xff09;持有。如图。 这个错误通常是由于其他进程正在…

3DMAX金属屋顶墙面铺设插件使用方法

3DMAX金属屋顶墙面铺设插件教程 3DMAX金属屋顶墙面铺设插件&#xff0c;一键生成金属板屋顶、金属外墙面板&#xff0c;是一款非常实用的建筑建模插件。 【适用版本】 3dMax7或更新版本 【使用方法】 1.启动3dMax软件&#xff0c;打开&#xff08;或创建&#xff09;场景文件…

《持续交付:发布可靠软件的系统方法》- 读书笔记(八)

持续交付&#xff1a;发布可靠软件的系统方法&#xff08;八&#xff09; 第 8 章 自动化验收测试8.1 引言8.2 为什么验收测试是至关重要的8.2.1 如何创建可维护的验收测试套件8.2.2 GUI 上的测试 8.3 创建验收测试8.3.1 分析人员和测试人员的角色8.3.2 迭代开发项目中的分析工…

Java学习 3. 习题 1.

一、 1. 2. 3. 4. 5. 二、 1. 2. 3. 4. 5. 6. 7. 8.

Vsan数据恢复—Vsan存储断电导致虚拟机无法启动的数据恢复案例

Vsan分布式存储故障&检测&#xff1a; 异常断电导致一台vsan存储设备上层虚拟机无法启动。 将故障Vsan存储上的所有磁盘编号后取出&#xff0c;由北亚企安的硬件工程师对vsan存储上的所有硬盘进行物理故障检测&#xff0c;经过检测没有发现硬盘存在物理故障。 vsan存储结构…

北邮22级信通院数电:Verilog-FPGA(7)第七周实验(2):BCD七段显示译码器(关注我的uu们加群咯~)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 关注作者的uu们可以进群啦~ 一.verilog代码 1.1 …

【数据结构】选择排序

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈数据结构 &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 直接选择、堆排序 1. 直接选择排序2…

网工内推 | 急招网工,思科、华为认证优先,法定节假日三薪

01 江苏臻云技术 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、负责落实数据中心机房日常网络监测及巡检任务&#xff1b; 2、负责数据中心网络设备日常监控、变更、维护、巡检&#xff1b; 3、负责日常巡检报告、故障维护报告、变更申请的文档的编制&#xff1b;…

微信小程序如何使用地球半径计算两组经纬度点之间的距离(自身位置与接口返回位置)【上】

目录 1.配置位置权限 2.获取当前自身经纬度 3. 请求接口拿到返回经纬 4. 循环取每一项的经纬 5.如何判断是否打开了定位权限 6.进行距离计算操作 7.运行效果 8.完整代码 首先在使用小程序时&#xff0c;请求的接口一定要去配置合法域名&#xff0c;才能够进行接下来…

【开源】基于SpringBoot的车险自助理赔系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 角色管理模块2.3 车辆档案模块2.4 车辆理赔模块2.5 理赔照片模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 车辆表3.2.3 理赔表3.2.4 理赔照片表 四、系统展示五、核心代码5.1 查询车…

基于机器视觉的行人口罩佩戴检测 计算机竞赛

简介 2020新冠爆发以来&#xff0c;疫情牵动着全国人民的心&#xff0c;一线医护工作者在最前线抗击疫情的同时&#xff0c;我们也可以看到很多科技行业和人工智能领域的从业者&#xff0c;也在贡献着他们的力量。近些天来&#xff0c;旷视、商汤、海康、百度都多家科技公司研…

【C++初阶】类和对象——构造函数析构函数拷贝构造函数

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C头疼记 目录 前言 类的6个默认成员函数 构造函数 概念 构造函数的特性 析构函数 概念 析构函数特性 拷贝构造函数 概念 拷贝构造函数特性 总结 前言 上篇文章我们对于C中的类有了初步的认识和…

【运维知识大神篇】两种方法,一键部署ElasticSearch集群(Shell+Ansible自动化部署)

本篇文章给大家介绍一下用Shell和Ansible两种方式&#xff0c;去一键部署ES&#xff08;ElasticSearch&#xff09;集群&#xff0c;实现在集群部署中的批量化操作&#xff0c;享受自动化部署的魅力。 准备主机 主机名IPcpudiskmemoryAnsible10.0.0.612C20G2GELK10410.0.0.10…