😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》本专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~
津津乐道设计模式 - 桥接模式详解
- 什么是桥接模式
- 桥接模式的适用场景
- 代码案例
- 桥接模式优缺点
- 结语
什么是桥接模式
桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象部分和实现部分解耦,使它们可以独立地变化。桥接模式的核心思想是将抽象和实现通过桥接接口连接起来,使得它们可以独立地变化,而不会相互影响。
桥接模式的适用场景
- 当系统中存在多个维度的变化时:桥接模式适用于存在多个维度的变化,并且每个维度都可以独立变化的情况。例如,一个图形绘制系统中有多种形状和多种颜色,桥接模式可以将形状和颜色抽象出来,并通过桥接接口将它们连接起来,从而可以灵活地组合不同的形状和颜色。
- 当需要抽象和实现的解耦时:桥接模式可以将抽象部分和实现部分解耦,使它们可以独立地变化。这样可以避免类爆炸的问题,减少子类的数量,并且可以方便地扩展和修改系统的功能。
- 当希望在运行时动态切换实现时:桥接模式可以在运行时动态切换实现,而不影响客户端代码。这使得系统更加灵活,可以根据不同的需求选择不同的实现。
总之,桥接模式适用于需要将抽象和实现解耦、存在多个维度的变化以及希望在运行时动态切换实现的情况。它可以提高系统的灵活性、可扩展性和可维护性。
代码案例
假设我们有一个咖啡店,它提供不同种类的咖啡和调料。我们可以使用桥接模式来实现咖啡和调料的抽象和实现的解耦。
首先,我们定义一个调料的接口 CoffeeAdditive,它有一个方法 add 用于添加调料:
public interface CoffeeAdditive {
void add();
}
然后,我们实现具体的调料类,例如糖(SugarAdditive)和牛奶(MilkAdditive):
public class SugarAdditive implements CoffeeAdditive {
@Override
public void add() {
System.out.println("添加糖");
}
}
public class MilkAdditive implements CoffeeAdditive {
@Override
public void add() {
System.out.println("添加牛奶");
}
}
然后,我们定义一个咖啡的抽象类 Coffee,它有一个抽象的方法 brew 用于冲泡咖啡:
public abstract class Coffee {
protected CoffeeAdditive additive;
public Coffee(CoffeeAdditive additive) {
this.additive = additive;
}
public abstract void brew();
}
接着,我们实现具体的咖啡类,例如美式咖啡(AmericanCoffee)和拿铁咖啡(LatteCoffee):
public class AmericanCoffee extends Coffee {
public AmericanCoffee(CoffeeAdditive additive) {
super(additive);
}
@Override
public void brew() {
System.out.println("冲泡美式咖啡");
additive.add();
}
}
public class LatteCoffee extends Coffee {
public LatteCoffee(CoffeeAdditive additive) {
super(additive);
}
@Override
public void brew() {
System.out.println("冲泡拿铁咖啡");
additive.add();
}
}
最后,我们可以创建具体的咖啡对象,并指定不同的调料:
public class BridgePatternTest {
public static void main(String[] args) {
CoffeeAdditive sugar = new SugarAdditive();
CoffeeAdditive milk = new MilkAdditive();
Coffee americanCoffeeWithSugar = new AmericanCoffee(sugar);
Coffee latteCoffeeWithMilk = new LatteCoffee(milk);
americanCoffeeWithSugar.brew();
System.out.println("==========================");
latteCoffeeWithMilk.brew();
}
}
整体案例代码结构如下
最后输出结果
通过桥接模式,我们将咖啡和调料部分以及具体的调料实现分离开来。这样,我们可以独立地扩展咖啡和调料的种类,并且可以根据需要自由地组合不同的咖啡和调料,而不会相互影响。这使得系统更加灵活,并且可以根据不同的需求创建出各种不同口味的咖啡。
桥接模式优缺点
桥接模式的优点包括:
-
解耦抽象和实现
:桥接模式将抽象和实现部分分离,使它们可以独立地变化,减少了它们之间的耦合关系。这样,对于抽象部分的修改不会影响到实现部分,也可以方便地扩展和修改系统的功能。 -
提高灵活性
:桥接模式可以在运行时动态地切换和组合抽象和实现,从而提高系统的灵活性。可以根据不同的需求选择不同的实现,并且可以在不修改客户端代码的情况下切换实现。 -
支持单一职责原则
:桥接模式将抽象和实现分离,使每个部分都有自己的职责。这符合单一职责原则,每个类只需要关注自己的领域,不会承担过多的责任。 -
可扩展性强
:由于桥接模式将抽象和实现解耦,因此可以方便地扩展新的抽象和实现类,而不会对现有的代码产生影响。这使得系统更容易进行功能扩展和维护。
桥接模式的缺点包括:
-
增加了系统的复杂性
:引入桥接模式会增加额外的抽象和实现类,增加了系统的复杂性和理解难度。因此,在设计时需要权衡利弊,避免过度使用桥接模式导致系统变得复杂而难以维护。 -
增加了代码量
:桥接模式需要定义抽象和实现之间的桥接接口,并且需要实现具体的抽象和实现类。这会增加代码量,对于简单的系统可能显得有些冗余。
结语
总的来说,桥接模式适用于需要将抽象和实现解耦、存在多个维度的变化、希望在运行时动态切换实现以及增强系统的灵活性和可扩展性的情况。然而,需要注意在使用桥接模式时,避免过度设计和过度复杂化,保持适度的简洁性和可读性。
如果本文对你有用,欢迎关注收藏评论,后续将陆续推出贴切生活的搞笑讲解方式带大家一起学编程~
样例代码:https://github.com/lhmyy521125/toher-designmode