设计模式——桥梁模式

桥梁模式

定义

桥梁模式(Bridge Pattern)也叫做桥接模式。

将抽象和显示解耦,使得两者可以独立地变化。

优缺点、应用场景

优点

  1. 抽象和实现的解耦。
    这是桥梁模式的主要特点,它完全是为了解决继承的缺点而提出的设计模式。
  2. 优秀的拓展能力
    在例子中,如果山寨公司要生产新产品,只需要新建一个产品类,然后通过有参构造传给公司类即可。
  3. 屏蔽实现细节
    高层模型无需关心细节的实现。

应用场景

  1. 不希望使用继承的场景
  2. 接口或抽象类不稳定的场景。
  3. 重用性要求较高的场景。

代码模拟场景

公司都会先生产产品再做销售,有些公司会生产热门山寨产品,赚一波风口钱后就转向生产另一种商品。

非桥梁模式

小结

  1. 在公司抽象中,生产和销售都单独作为一个方法,即一个类只能实现一种商品的生产与销售。
  2. 当公司业务线变化后,需要修改公司类自身的代码逻辑,不利于拓展。

UML图

在这里插入图片描述

公司抽象和实现

/*** 公司 抽象*/
public abstract class Corp {/*** 生产产品*/protected abstract void produce();/*** 销售产品*/protected abstract void sell();/*** 核心工作——赚钱*/public void makeMoney() {// 先生产,后销售this.produce();this.sell();}
}/*** 房产公司*/
public class RealtyCorp extends Corp {static {System.out.println("=====房地产公司是这样运行的=====");}@Overrideprotected void produce() {System.out.println("房地产公司盖房子...");}@Overrideprotected void sell() {System.out.println("房地产公司买房子");}@Overridepublic void makeMoney() {super.makeMoney();System.out.println("房地产公司赚大钱");}
}/*** 服装公司*/
public class ClothesCorp extends Corp {static {System.out.println("=====服装公司是这样运行的=====");}@Overrideprotected void produce() {System.out.println("服装公司盖房子...");}@Overrideprotected void sell() {System.out.println("服装公司买房子");}@Overridepublic void makeMoney() {super.makeMoney();System.out.println("服装公司赚小钱");}
}/*** IPod山寨公司*/
public class IPodCorp extends Corp {static {System.out.println("=====山寨公公司是这样运行的=====");}@Overrideprotected void produce() {System.out.println("我生产IPod...");}@Overrideprotected void sell() {System.out.println("我销售IPod嘿嘿嘿...");}@Overridepublic void makeMoney() {super.makeMoney();System.out.println("山寨也能赚...");}
}

入口类方法

private static void notBridgePattern() {// 房地产公司赚钱RealtyCorp realtyCorp = new RealtyCorp();realtyCorp.makeMoney();System.out.println();// 服装公司赚钱ClothesCorp clothesCorp = new ClothesCorp();clothesCorp.makeMoney();System.out.println();// 山寨公司赚钱IPodCorp iPodCorp = new IPodCorp();iPodCorp.makeMoney();
}

结果

在这里插入图片描述

桥梁模式

小结

  1. 桥梁模式中,引入产品作为桥梁,公司只需要专注于通过哪种产品赚钱
  2. 当公司经营的产品发生变化时,只需要修改、添加新的产品类即可

UML图

在这里插入图片描述

产品抽象和实现

/*** 产品 抽象*/
public abstract class Product {/*** 产品被生产出*/public abstract void beProduced();/*** 产品被销售*/public abstract void beSell();
}/*** 房子产品*/
public class House extends Product {@Overridepublic void beProduced() {System.out.println("生产房子咯....");}@Overridepublic void beSell() {System.out.println("销售房子咯....");}
}/*** IPod产品*/
public class IPod extends Product {@Overridepublic void beProduced() {System.out.println("生产出山寨IPod...");}@Overridepublic void beSell() {System.out.println("销售山寨IPod...");}
}

公司抽象和实现

/*** 公司 抽象*/
public abstract class Corp {/*** 公司要有自己的产品*/private Product product;public Corp(Product product) {this.product = product;}/*** 核心工作——赚钱*/public void makeMoney() {// 先生产,后销售this.product.beProduced();this.product.beSell();}
}/*** 房产公司*/
public class RealtyCorp extends Corp {static {System.out.println("=====房地产公司是这样运行的=====");}public RealtyCorp(Product product) {super(product);}@Overridepublic void makeMoney() {super.makeMoney();System.out.println("房地产公司赚大钱");}
}/*** IPod山寨公司*/
public class IPodCorp extends Corp {static {System.out.println("=====山寨公公司是这样运行的=====");}public IPodCorp(Product product) {super(product);}@Overridepublic void makeMoney() {super.makeMoney();System.out.println("山寨也能赚...");}
}

入口类方法

private static void bridgePattern() {// 房地产公司赚钱RealtyCorp realtyCorp = new RealtyCorp(new House());realtyCorp.makeMoney();// 山寨公司赚钱IPodCorp iPodCorp = new IPodCorp(new IPod());iPodCorp.makeMoney();
}

结果

在这里插入图片描述

参考书籍

秦小波《设计模式之禅》

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

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

相关文章

成为一个年薪30W+的DFT工程师是一种什么体验?

一直以来,DFT都是数字IC设计行业中相对神秘的一个岗位。 你说他重要吧,并不是所有芯片设计公司都有这个岗位,你说他不重要吧,但凡芯片产品达到一定规模后,就必须设置DFT部门。 一、什么是DFT? DFT&#x…

原生信息流广告APP应用内增收及计费模式

比起传统的广告宣传,信息流最大的优势就在于流量的庞大。与此同时,多样化的信息流广告形式和精准的定向,还可以帮助广告主准确获取意向流量。此外,它的广告形式不强迫推送,因此也受到了广泛用户的支持和青睐。 原生信…

音视频开发实战03-FFmpeg命令行工具移植

一,背景 作为一个音视频开发者,在日常工作中经常会使用ffmpeg 命令来做很多事比如转码ffmpeg -y -i test.mov -g 150 -s 1280x720 -codec libx265 -r 25 test_h265.mp4 ,水平翻转视频:ffmpeg -i src.mp4 -vf hflip -acodec copy …

26.JavaWeb-SpringSecurity安全框架

1.SpringSecurity安全框架 Spring Security是一个功能强大且灵活的安全框架,它专注于为Java应用程序提供身份验证(Authentication)、授权(Authorization)和其他安全功能。Spring Security可以轻松地集成到Spring框架中…

MySQL数据库(五)

目录 一、数据库的约束 1.1 约束类型 1.1.1 null约束 1.1.2unique约束 1.1.3default默认值约束 1.1.4primary key主键约束 1.1.5foreign key外键约束 二、内容重点总结 一、数据库的约束 1.1 约束类型 not null - 指示某列不能存储 null值。unique - 保证某列的每行必须有唯一…

上市公司Git分支管理规范

Git分支管理策略 主分支Master 首先,代码库应该有一个、且仅有一个主分支。所有提供给用户使用的正式版本,都在这个主分支上发布。 Git主分支的名字,默认叫做Master。它是自动建立的,版本库初始化以后,默认就是在主…

采集传感器的物联网网关怎么采集数据?

随着工业4.0和智能制造的快速发展,物联网(IoT)技术的应用越来越广泛,传感器在整个物联网系统中使用非常普遍,如温度传感器、湿度传感器、光照传感器等,对于大部分物联网应用来说,采集传感器都非…

Ubuntu学习笔记(二)——文件属性与权限

文章目录 前言一、用户与用户组1.用户(文件拥有者)2.用户组3.其他人 二、Linux用户身份与用户组记录文件1. /etc/passwd2. /etc/shadow3. /etc/group 三、文件属性与权限1. 查看文件属性的方法(ls)2.文件属性详细介绍2.1 权限2.2 …

MacOS触控板缩放暂时失灵问题解决

我的系统版本为Monterey 12.5.1,亲测有效 直接创建脚本xxx.sh,并在终端执行脚本bash xxx.sh即可解决此问题,脚本内容如下: #!/bin/bashkillall Finder #kill Finder如不需要可以删除 killall Dock #kill Dock 如不需要可以删…

【wxWidgets】使用布局控件进行窗口布局

使用布局控件进行窗口布局 窗口布局基础 为了在各种环境中都能使窗口拥有合适的位置和大小,可能需要在OnSize事件中计算每一个窗口的大小并设置新位置,当然使用窗口布局控件可以更方便地实现 如果选择使用布局控件,可以通过自己编写或者使用…

【汉诺塔问题分析】

一、背景 汉诺塔问题是一种经典的递归问题,它由法国数学家Huygens在1665年发现,也是一道有趣的数学难题。这道问题的主要目的是将三根柱子上的一堆盘子移动到另一根柱子上,移动过程中每次只能移动一个盘子,并且大盘子不能放在小盘…

[QT编程系列-10]:C++图形用户界面编程,QT框架快速入门培训 - 4- QT画图与动画

目录 4. QT画图与动画 4.1 QT的绘图系统 4.2 案例目标 4.3 绘制过程 4.4 更换控件的icon 4.5 案例2 4.6 坐标轴 4. QT画图与动画 4.1 QT的绘图系统 QT(也称为Qt Framework)是一种流行的跨平台应用程序开发框架,它提供了丰富的图形用户…

集群基础1——集群概念、LVS负载均衡

文章目录 一、基本了解二、LVS负载均衡2.1 基本了解2.2 工作模式2.2.1 NAT模式2.2.2 DR模式2.2.3 LVS-TUN模式2.2.4 LVS-FULLNAT模式 三、调度器算法四、ipvsadm命令 一、基本了解 什么是集群? 多台服务器做同一件事情。 集群扩展方式: scale up&#xf…

2023年7月北京/广州/深圳制造业产品经理NPDP认证招生

产品经理国际资格认证NPDP是新产品开发方面的认证,集理论、方法与实践为一体的全方位的知识体系,为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会(PDMA)成立于1979年,是…

C# 移除链表元素

203 移除链表元素 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5] 示例 2&#x…

2023-07-14:讲一讲Kafka与RocketMQ中存储设计的异同?

2023-07-14:讲一讲Kafka与RocketMQ中存储设计的异同? 答案2023-07-14: 在Kafka中,文件的布局采用了Topic/Partition的方式,每个分区对应一个物理文件夹,且在分区文件级别上实现了顺序写入。然而&#xff0…

WIN无法访问linux开启的SAMBA服务器

WIN无法访问linux开启的SAMBA服务器 打开搜索框“管理Windows凭据” 点击编辑

Camtasia Studio 2023保存为mp4格式的视频的详细教程,Camtasia的视频导出功能

很多用户刚接触Camtasia Studio,不熟悉如何保存mp4格式的视频。在今天的文章中小编为大家带来了Camtasia Studio 2023保存为mp4格式的视频的详细教程介绍。 1、 打开Camtasia Studio。 Camtasia Studio- 2023 win: https://souurl.cn/1JFEsn Camtasia …

06_本地方法接口+07_本地方法栈

一、本地方法? 本地方法就是Java调用非Java代码的接口。 本地方法的作用是融合不同的编程语言为Java所用,它的初衷是融合 C、C程序 二、为什么要使用Native Method? 三、本地方法栈 Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于…

【Linux】Docker 基本管理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Docker 基本管理 Docker 概述Docker 核心概念Docker 安装部署Docker 镜像操作Docker 容器操作 Docker 概述 Docker是一个开源的应用容器引擎,基于go语言开发并遵…