Java特性之设计模式【桥接模式】

news2024/12/22 18:34:46

一、桥接模式

概述

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦

这种模式涉及到一个作为桥接的接口,使得实体类的功能独立于接口实现类。这两种类型的类可被结构化改变而互不影响

主要解决:在有多种可能会变化的情况下,用继承会造成类爆炸问题,扩展起来不灵活

何时使用:实现系统可能有多个角度分类,每一种角度都可能变化

观察者模式(Observer) 也叫做"发布-订阅模式"(Publish / Subscribe)

优缺点

优点:

1、抽象和实现的分离

2、优秀的扩展能力

3、实现细节对客户透明

缺点:

桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程

1. 各个角色介绍

1.1 抽象化(Abstraction)

定义抽象类接口并且维护一个指向接口的指针

1.2 扩展抽象化(Refined Abstraction)

是抽象类角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法

1.3 实现化(Implementor)

定义接口类角色的接口,供扩展抽象类角色调用

1.4 具体实现化(Concrete Implementor)

给出实现化角色接口的具体实现

2. UML图

在这里插入图片描述

3. 具体例子和代码

角色分配

  • Food:食物抽象类
  • Juice:果汁类(继承食物抽象类)
  • Fruit:水果接口
  • AppleFruit:苹果
  • BananaFruit:香蕉
  • StrawberryFruit:草莓

3.1 抽象类以及子类

  • Food
package com.vinjcent.pattern.bridge;

/**
 * @author vinjcent
 * @description 食物抽象类
 */
public abstract class Food {

    protected Fruit fruit;

    /**
     * 构造
     *
     * @param fruit 水果接口
     */
    public void setFruit(Fruit fruit) {
        this.fruit = fruit;
    }

    /**
     * 组合水果时,使用make制作
     */
    public abstract void make();


}

  • Juice
package com.vinjcent.pattern.bridge;

/**
 * @author vinjcent
 * @description 果汁类
 */
public class Juice extends Food {

    @Override
    public void make() {
        fruit.compose("果汁");
    }
}

3.2 接口类以及实现类

  • Fruit
package com.vinjcent.pattern.bridge;

/**
 * @author vinjcent
 * @description 水果接口
 */
public interface Fruit {


    /**
     * 组合水果
     *
     * @param food 后缀的食物名称
     */
    void compose(String food);
}

  • AppleFruit
package com.vinjcent.pattern.bridge;

/**
 * @author vinjcent
 * @description 苹果
 */
public class AppleFruit implements Fruit {


    @Override
    public void compose(String food) {
        System.out.println("苹果" + food);
    }
}

  • BananaFruit
package com.vinjcent.pattern.bridge;

/**
 * @author vinjcent
 * @description 香蕉
 */
public class BananaFruit implements Fruit {

    @Override
    public void compose(String food) {
        System.out.println("香蕉" + food);
    }
}

  • StrawberryFruit
package com.vinjcent.pattern.bridge;

/**
 * @author vinjcent
 * @description 草莓
 */
public class StrawberryFruit implements Fruit {
    @Override
    public void compose(String food) {
        System.out.println("草莓" + food);
    }
}

3.3 测试主函数

package com.vinjcent.pattern.bridge;

/**
 * @author vinjcent
 */
public class Main {

    public static void main(String[] args) {

        // 1.创建苹果、香蕉、草莓
        AppleFruit apple = new AppleFruit();
        BananaFruit banana = new BananaFruit();
        StrawberryFruit strawberry = new StrawberryFruit();
        // 2.创建果汁对象
        Juice juice = new Juice();
        // 3.设置水果为苹果
        juice.setFruit(apple);
        // 4.制作
        juice.make();

        // 5.设置水果为香蕉
        juice.setFruit(banana);
        // 6.制作
        juice.make();

        // 7.设置水果为草莓
        juice.setFruit(strawberry);
        // 8.制作
        juice.make();
    }

}

  • 测试结果

在这里插入图片描述

4. 使用场景

  • 如果一个系统需要在构件的抽象化角色和具体化角色之间增加更多的灵活性,避免在两个层次之间建立静态的继承联系,通过桥接模式可以使它们在抽象层建立一个关联关系
  • 对于那些不希望使用继承或因为多层次继承导致系统类的个数急剧增加的系统,桥接模式尤为适用
  • 一个类存在两个独立变化的维度,且这两个维度都需要进行扩展

注意事项:

对于两个独立变化的维度,使用桥接模式再适合不过了

在这里插入图片描述

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

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

相关文章

67. 二进制求和

文章目录题目描述竖式模拟转换为十进制计算题目描述 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 输入:a “11”, b “1” 输出:“100” 示例 2: 输入:a “1010”, b “1011” …

“白学”了十几年?这两年才感悟出的高效学习方法

作者:元青 微信公众号 「技乐书香」 引言 虽然从小学开始算起,一直到我现在硕士快毕业,已经学习了接近十九年了,但是只有最近两年算得上真正的在"学习",之前的十七年都没有明白也没有认可学习的意义&#…

网络安全实验室7.综合关

7.综合关 1.渗透测试第一期 url:http://lab1.xseclab.com/base14_2d7aae2ae829d1d5f45c59e8046bbc54/ 进入忘记密码页面,右键查看源码,发现一个手机号 解题思路:通过给admin用户绑定13388758688手机号码,然后再进行…

【软件测试】企业测试面试题9道,从自我介绍到项目考察+回答......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 1、自我介绍 您好&a…

leaflet 上传WKT文件,在地图上显示图形(示例代码055)

第055个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中加载WKT文件,将图形显示在地图上。WKT(Well-known text)是一种文本标记语言,可以表示的几何对象包括:点,线,多边形,TIN(不规则三角网)及多面体。可以通过几何集合的方式来表示不同维度的几何对象。 …

centos学习记录

遇到的问题及其解决办法 centos7安装图形化界面 yum groupinstall ‘X Window System’ yum groupinstall -y ‘GNOME Desktop’ 安装完成后输入init 5进入图形化界面 centos7安装vmware-tools 第一步卸载open-vm-tools 输入命令 yum remove open-vm-tools 输入命令 reboot 在…

你必须知道的 clientWidth, offsetWidth, scrollWidth.

前言: 在公司移动端项目中,我需要十分频繁的和 DOM 元素的各种 width、height 打交道。但是这里有这么多关于 width 的属性,它们之间的区别到底体现在哪里?这是我刚刚接触移动端项目十分头疼的一个问题。经过几天的查阅&#xff0…

Django的基础使用

安装Django pip3 install django2.2.5检查是否安装Djangopip3 freeze|grep -i Django创建工程django-admin startproject 名称如:django-admin startproject bookmanager进入bookmanager目录运行django运行python:python manage.py runserver查看django进…

C++基础(5) - 复合类型(上)

文章目录数组1、什么是数组2、数组的声明3、数组的初始化4、数组的访问5、二维数组6、memset —— 给数组中每一个元素赋同样的值字符串(字符数组)1、string.h 头文件1.1 strlen()1.2 strcmp()1.3 strcpy()1.4 strcat()string 类简介1、C11 字符串初始化…

代码随想录算法训练营第二十六天 | 39. 组合总和,40.组合总和II,131.分割回文串

一、参考资料组合总和题目链接/文章讲解:https://programmercarl.com/0039.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8C.html 视频讲解:https://www.bilibili.com/video/BV1KT4y1M7HJ 组合总和II题目链接/文章讲解:https://programmercarl.com/004…

STL——stack

一、stack介绍和使用 1.stack文档介绍 (1)stack是一种容器适配器,专门用于具有后进先出操作的上下文环境中,其只能从容器的一端进行元素的插入与删除,以及提取操作。 (2)stack是作为容器适配…

Python如何安装模块,python模块安装失败的原因以及解决办法

前言 今天来给刚开始学习python的朋友讲解一下 如何安装python模块, python模块安装失败的原因以及解决办法 很多朋友拿到代码之后,就开始复制粘贴 --> 然后右键进行运行 结果就是报错说 没有这个模块 得安装啥的 Python模块安装 一. 打开命令提示符 win …

分布式项目-品牌管理(5、6)

【今日成果】: //使用阿里云OSS服务: //使用v-if如果地址没有就不显示 , 如果地址错误图片就显示不出来; 【快速回顾】: 任何数据的删除都不要使用物理上的删除,应当使用逻辑上的删除!&…

2023,AI 技能学起来

这段时间,ChatGPT 算是火出圈了。不仅朋友圈转发各种 ChatGPT 的文章,连我夫人这种从来不关注科技新闻的人也问我 ChatGPT 是怎么回事。其实我算是比较早知道并关注 ChatGPT 的,去年 12 月份还写了一篇文章 AI 也会写代码了,但我并…

一文讲清chatGPT的发展历程、能力来源和复现它的关键之处

1. ChatGPT是什么 chatGPT是什么?这可能是最近被问的最多的一个。 大家第一反应这应该是GPT系列的一个最新模型,普通大众可能更愿意把它看做是一个人工智能。实际上,它其实就是一个基于大规模语言模型的对话系统产品。官网对它定义十分的明…

前端——周总结系列四

1 JS变量与常量 概述 变量:在后续编码过程中会被重新赋值,是不断变化的。常量:固定不变的数据,日常生活比如性别男,代码层面是在编码过程中不会变化的固定数据。 命名规则 变量 可以包含数字,字母&…

四家文档管理系统中披露的未修补安全漏洞

四家供应商 LogicalDOC、Mayan、ONLYOFFICE 和 OpenKM 的开源和免费增值文档管理系统 (DMS) 产品中披露了多个未修补的安全漏洞。 佛山市东联科技有限公司网络安全研究人员表示,这八个漏洞提供了一种机制,“攻击者可以通过该机制说服人类操作员在平台上…

背包问题代码合集(C/C++)

目录 1 01背包问题 2 完全背包问题 3 多重背包问题 4 分组背包问题 1 01背包问题 有N件物品和一个容量是V的背包。每件物品只能使用一次。 第 物品的体积是,价值是。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,…

找数字(字符串思维题)

刚开始自己的思路:用dfs暴搜,没考虑时间复杂度(准确来说当时不知道该题的时间复杂度该怎么算),如果用暴搜写的话是(10的100次方) 正确的思路:最小值:定义一个长度为m的空…

(C语言)指针进阶

问:1. ( ),[ ],->,,--,. ,*的操作符优先级是怎么样的?2. Solve the problems:只有一个常量字符串与一个字符指针,该怎么打印常量字符串所有内容…