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

结构型-桥接模式(Bridge Pattern)

概述

桥接模式(Bridge Pattern)是一种结构型设计模式,将抽象部分和实现部分分离,使它们可以独立地变化。桥接模式通过将继承关系转化为关联关系,将抽象部分和实现部分分离开来,从而使它们可以独立地变化。这种分离使得抽象部分和实现部分可以独立地扩展和修改,互不影响。

桥接模式由两个独立的层次结构组成:抽象部分和实现部分。抽象部分定义了抽象类和接口,它包含了对实现部分的引用,并且定义了抽象方法。实现部分定义了接口和具体类,它实现了抽象部分定义的接口,并且提供了具体的实现。抽象部分和实现部分之间通过关联关系进行连接。

优点:

  • 可以将抽象部分和实现部分独立地进行扩展和修改,互不影响。这样可以减少系统的复杂性。
  • 可以在运行时动态地将抽象部分和实现部分进行组合。这样可以根据需要来选择不同的实现方式。
  • 可以减少继承关系的使用。继承关系是一种静态的关系,它在编译时就确定了,而桥接模式是一种动态的关系,它在运行时可以动态地进行组合。

缺点:

  • 增加了系统的复杂性,因为需要定义抽象部分和实现部分的接口和维护它们之间的关系。
  • 对于简单的系统,桥接模式可能会增加不必要的复杂性。

使用场景:

  • 当一个类存在两个或多个不相关的维度时,可以使用桥接模式将其拆分成两个或多个独立的层次结构。
  • 当需要修改一个类的实现细节时,可以使用桥接模式将其与其他类分离,便于进行独立的修改。
  • 当希望避免在接口和实现部分之间出现强紧耦合关系时,可以使用桥接模式。

示例

抽象电视和具体电视机制造厂商:电视可以是液晶、等离子和CRT电视机,而抽象电视可以根据不同的电视制造厂商进行操作。

首先定义一个抽象类,代表抽象部分:

public abstract class TV {protected Manufacturer manufacturer;protected TV(Manufacturer manufacturer) {this.manufacturer = manufacturer;}public abstract void produce();
}

接下来定义一个实现部分的接口:

public interface Manufacturer {public void manufacture();
}

为抽象类和接口添加具体的实现,如下所示:

public class Sony implements Manufacturer {public void manufacture() {System.out.println("Manufacturing TV by Sony");}
}public class Samsung implements Manufacturer {public void manufacture() {System.out.println("Manufacturing TV by Samsung");}
}

最后,我们将实现部分的具体实现注入到抽象类中,如下所示:

public class SmartTV extends TV {public SmartTV(Manufacturer manufacturer) {super(manufacturer);}public void produce() {System.out.print("Producing Smart TV... ");manufacturer.manufacture();}
}

现在,我们可以使用桥接模式来生产不同制造商的智能电视,如下所示:

public class BridgePatternDemo {public static void main(String[] args) {TV sonySmartTV = new SmartTV(new Sony());sonySmartTV.produce();TV samsungSmartTV = new SmartTV(new Samsung());samsungSmartTV.produce();}
}

输出结果为:

Producing Smart TV... Manufacturing TV by Sony
Producing Smart TV... Manufacturing TV by Samsung

http://www.lryc.cn/news/99679.html

相关文章:

  • 基于小波哈尔法(WHM)的一维非线性IVP测试问题的求解(Matlab代码实现)
  • 前端(Electron Nodejs)如何读取本地配置文件
  • 没有 telnet 不能测试端口?容器化部署最佳的端口测试方式
  • 漏洞发现-BurpSuite插件-Fiora+Fastjson+Shiro
  • Elasticsearch-倒排索引
  • pagehelper与mybatis-plus冲突的解决办法
  • 解决使用Timer时出现Task already scheduled or cancelled异常的问题
  • P1175 后缀表达式
  • 【HashMap】49. 字母异位词分组
  • golang实现多态
  • formatter的用法,深拷贝, Object.assign 方法实战。
  • Windows上安装和使用git到gitoschina和github上_亲测
  • MATLAB算法实战应用案例精讲-【深度学习】预训练模型GPTXLNet
  • Spring data JPA常用命令
  • Excel的使用
  • 大数据课程D4——hadoop的MapReduce
  • java策略模式
  • Vue2封装自定义全局Loading组件
  • docker 搭建jenkins
  • 【Docker】Docker 部署 Mysql 并设置数据持久化
  • 【ARM 常见汇编指令学习 5 -- arm64汇编指令 wzr 和 xzr】
  • 4.4 成员变量与局部变量的区别有哪些?
  • 学生管理系统-03项目案例(3)
  • Banana Pi BPI-KVM – 基于 Rockchip RK3568 SoC 的 KVM over IP 解决方案
  • 面试:Spring Cloud和Kubernetes的优缺点
  • TSINGSEE青犀视频安防监控视频平台EasyCVR新增密码复杂度提示
  • 前端开发中的正则表达式:解密规则的魔法
  • const的用法
  • 机器学习深度学习——模型选择、欠拟合和过拟合
  • IP 服务级别协议监控