桥接模式介绍

桥接模式介绍1 桥接模式 Bridge 模式 是指 将实现与抽象放在两个不同的类层次中 使两个层次可以独立改变 是一种结构型设计模式 2 桥接模式基于类的最小设计原则 通过使用封装 聚合及继承等行为让不同的类承担不同的职责 它的主要特点是把抽象 Abstraction 与行为实现 Implementati 分离开来 从而可以保持各部分的独立性以及应对他们的功能扩展 3 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统 桥接模式尤为适用

一、基本介绍

  1. 桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变,是一种结构型设计模式。
  2. 桥接模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。
  3. 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用。

二、代码案例

(1)新建品牌接口及其实现类

public interface Brand { 
    void open(); void close(); void product(); } 
public class Huawei implements Brand { 
    @Override public void open() { 
    System.out.println(" 开启华为生产线 "); } @Override public void close() { 
    System.out.println(" 关闭华为生产线 "); } @Override public void product() { 
    System.out.println(" 生产华为设备 "); } } 
public class XiaoMi implements Brand { 
    @Override public void open() { 
    // TODO Auto-generated method stub System.out.println(" 开启小米生产线 "); } @Override public void close() { 
    // TODO Auto-generated method stub System.out.println(" 关闭小米生产线 "); } @Override public void product() { 
    // TODO Auto-generated method stub System.out.println(" 生产小米设备 "); } } 

(2)新建设备抽象类及其子类

public abstract class Machine { 
    private Brand brand; public Machine(Brand brand) { 
    super(); this.brand = brand; } protected void open() { 
    this.brand.open(); } protected void close() { 
    brand.close(); } protected void product() { 
    brand.product(); } } 
public class Phone extends Machine { 
    public Phone(Brand brand) { 
    super(brand); } public void open() { 
    super.open(); System.out.println(" 手机生产线 "); } public void close() { 
    super.close(); System.out.println(" 手机生产线 "); } public void product() { 
    super.product(); System.out.println(" 手机生产线 "); } } 
public class Watch extends Machine { 
    public Watch(Brand brand) { 
    super(brand); } public void open() { 
    super.open(); System.out.println(" 手表生产线 "); } public void close() { 
    super.close(); System.out.println(" 手表生产线 "); } public void product() { 
    super.product(); System.out.println(" 手表生产线 "); } } 

(3)测试

public class Client { 
    public static void main(String[] args) { 
    Machine phone = new Phone(new XiaoMi()); phone.open(); phone.product(); phone.close(); System.out.println("======================="); Machine watch = new Watch(new Huawei()); watch.open(); watch.product(); watch.close(); System.out.println("======================="); Machine phone2 = new Phone(new Huawei()); phone2.open(); phone2.product(); phone2.close(); System.out.println("======================="); Machine watch2 = new Watch(new XiaoMi()); watch2.open(); watch2.product(); watch2.close(); } } 

三、UML类图

桥接模式UML类图

四、桥接模式小结

  • 实现了抽象和实现部分的分离,从而极大的提供了系统的灵活性,让抽象部分和实现部分独立开来,这有助于系统进行分层设计,从而产生更好的结构化系统。
  • 对于系统的高层部分,只需要知道抽象部分和实现部分的接口就可以了,其它的部分由具体业务来完成。
  • 桥接模式替代多层继承方案,可以减少子类的个数,降低系统的管理和维护成本。
  • 桥接模式的引入增加了系统的理解和设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计和编程。
  • 桥接模式要求正确识别出系统中两个独立变化的维度,因此其使用范围有一定的局限性,即需要有这样的应用场景。

其他设计模式

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233817.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Enterprise Library 2.0 — Logging Application Block (上)「建议收藏」

    Enterprise Library 2.0 — Logging Application Block (上)「建议收藏」Enterprise Library 2.0 — Logging Application Block (上)

    2022年4月21日
    33
  • idea怎么搭建springboot_你没有创建该项目的权限

    idea怎么搭建springboot_你没有创建该项目的权限一般来说,用IDEA创建SpringBoot项目有两种方式。其一是Spring官网提供了一个快速生成SpringBoot项目的网站,可以在官网直接下载后,再导入IDEA中。另外一种是直接用IDEA创建一个SpringBoot项目,一般开发也是用的这种方式进行创建。虽说SpringBoot简化了Spring的配置,但学习之前需要对Spring基础知识有一定的掌握。……

    2022年10月13日
    0
  • SQL中like的用法.[通俗易懂]

    SQL中like的用法.[通俗易懂]Like的运用场合主要在模糊查询的时候,一般以查询字符串居多,这里据一些例子来说他的一般用法:例1,查询name字段中包含有“明”字的。这里不要使用*来代替,一般在使用0个或者任意个字符构成的字符

    2022年7月4日
    28
  • python中文件的写入_python列表写入txt文件

    python中文件的写入_python列表写入txt文件1.自己写入txt直接上核心代码:withopen(“douban.txt”,”w”)asf:f.write(“这是个测试!”)12这句话自带文件关闭功能,所以和那些先open再write再close的方式来说,更加pythontic!结果就是这样:2.将文件输入(print)的内容写入txt我并不喜欢手写字符,更多时候用到的就是将程序跑出来的print写到txt中保存,比如

    2022年10月2日
    0
  • 【Redis】五种数据类型「建议收藏」

    【Redis】五种数据类型「建议收藏」【Redis】五种数据类型

    2022年4月25日
    41
  • NULL与nullptr

    传统意义上来说,c++把NULL、0视为同一种东西,有些编译器将NULL定义为((void*)0),有些将其定义为0.c++不允许直接将void*隐式的转化为其他类型,但是如果NULL被定义为((void*)0),当编译char*p=NULL;NULL只好被定义为0。还有:void  func(int);void  func(char*);如果NULL被定义为0,func(NUL…

    2022年4月6日
    324

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号