[java] 23种设计模式之桥接模式

一、什么是桥接模式

桥接(Bridge)模式属于结构型设计模式。通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展。

二、适用场景

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

三、代码示例

场景: 一个甜品店,售卖的食品有蛋糕、奶茶和牛奶,但是每个商品都有各种口味:草莓味、芒果味、香蕉味。

如果这时候食品又新增了拿铁,口味又新增了青提,难道要把商品和口味再全部绑定一套吗?

显然这种两个维度扩展的情况不适合这种方案。那我们另辟蹊径,创建两个父类,一个食品类一个水果类。两个父类各自包含了相应的子类,然后根据需要将食品和水果进行组合。如下:

代码:

public abstract class Food {private Fruit fruit;public Food(Fruit fruit) {this.fruit = fruit;}public abstract void add();
}

public class Cake extends Food{Fruit fruit1;public Cake(Fruit fruit) {super(fruit);fruit1 =fruit;}@Overridepublic void add() {fruit1.beAdd("蛋糕");}
}

public class Milk extends Food{Fruit fruit;public Milk(Fruit fruit1) {super(fruit1);fruit = fruit1;}@Overridepublic void add() {fruit.beAdd("牛奶");}
}

public interface Fruit {public void beAdd(String food);
}

public class Banana implements Fruit {@Overridepublic void beAdd(String food) {System.out.println("香蕉" + food);}
}

public class Mango implements Fruit {@Overridepublic void beAdd(String food) {System.out.println("芒果" + food);}
}

public class Test {public static void main(String[] args) {Banana banana = new Banana();Mango mango = new Mango();Cake cake = new Cake(banana);cake.add();Milk milk = new Milk(mango);milk.add();}
}

输出:

香蕉蛋糕
芒果牛奶
 

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

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

相关文章

不知道吧,腾讯云轻量应用服务器使用有一些限制!

腾讯云轻量应用服务器相对于云服务器CVM是有一些限制的,比如轻量服务器不支持更换内网IP地址,不支持自定义私有网络VPC,内网连通性方面也有限制,轻量不支持CPU内存、带宽或系统盘单独升级,只能整个套餐整体升级&#x…

Intellij IDEA 中 git 操作的快捷键

1.添加新建的文件 即add 操作 shift alt a 2.提交操作 即 commit操作 ctrl k 在窗口中可以用feature来声明此次更新的内容 3.提交操作 即push操作 ctrl shift k 4.拉去远程分支操作 即pull操作 ctrl t

一个爬虫自动化数据采集的故事~

目录 一、原文二、故事前半段背景内容三、正经的讲点DrissionPage知识四、故事的收尾 一、原文 原文来自一个爬虫自动化数据采集的故事~ , 建议点击链接看文章末尾的视频笔者不擅长自动化,一个小小故事分享给大家,仅个人观点 二、故事前半段背景内容 …

【C语言】linux内核tcp_write_xmit和tcp_write_queue_purge

tcp_write_xmit 一、讲解 这个函数 tcp_write_xmit 是Linux内核TCP协议栈中的一部分,其基本作用是发送数据包到网络。这个函数会根据不同情况推进发送队列的头部,确保只要远程窗口有空间,就可以发送数据。 下面是对该函数的一些主要逻辑的中…

python爬虫(4)

#前期先说明一下为啥爬虫需要学习数组的存储和处理,只是说在你后期接触到最简单的爬虫后有一个地方可以存放你的数据# 下面为大家带来一个我在做excel表整理时的代码以及上次代码的结果 上次代码的结果: 新的代码: import numpy as np im…

委员建议进一步扩大香港与内地金融市场互联互通发展

在我们共同追寻金融发展的星辰大海之际,我怀着无比激动的心情,向诸位委员提议进一步扩大香港与内地金融市场互联互通发展。这个议题犹如一颗璀璨的明珠,闪耀着诱人的光芒,吸引着我们为之奋斗。让我们共同探讨这一话题,…

如何变得心智成熟?我推荐你读这5本书

一个人若总是在底层混,说明他的脑子确实不怎么样,一群底层的人聚在一起就更完蛋。 变化是常态,成长是选择。无法否定过去相信的东西,是你最大的障碍。 今天,为大家推荐一份“心智书单”。 01 《打开心智》 李睿秋提…

【产品应用】一体化步进伺服电机在绿光激光打标机中的应用

随着科技的不断发展,激光打标技术已经成为现代工业生产中不可或缺的一部分。绿光激光打标机以其高精度、高效率、高可靠性等特点,广泛应用于各种材料的标记与打标。而在绿光激光打标机中,一体化步进电机的应用则为其带来了更高的性能与更稳定…

EF Core Power Tools成生DbFirstEF Core电动工具成生DbFirst

1. 2.选择数据库与表 3.参数设定 4.把连接字符串放到脚本里面 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){string conStr ConfigurationManager.ConnectionStrings["Context"].ConnectionString;optionsBuilder.UseSqlServe…

Leetcode每日一题】 二维前缀和 - 矩阵区域和(难度⭐⭐)(31)

1. 题目解析 题目链接:1314. 矩阵区域和 题目乍一看很晦涩难懂,又是大于等于又是k的 仔细分析,题目所说的意思就是以[i,j]为中心,求上下左右向外拓展k个单位的矩阵和,放在名为answer的矩阵中,最后返回ans…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Gauge)

数据量规图表组件,用于将数据展示为环形图表。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 可以包含单个子组件。 说明: 建议使用文本组件构建当前数值文本和辅…

【leetcode】429. N 叉树的层序遍历

题目描述 给定一个 N 叉树,返回其节点值的_层序遍历_。(即从左到右,逐层遍历)。 树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。 示例 1: 输入:…