桥接模式来啦

桥接模式可通过组合的方式,将抽象和实现的部分连接起来。就实现方式来说,桥接模式和适配器模式有相似之处,但是二者应用的阶段不同。桥接模式应用于设计阶段,适配器模式应用于代码重构阶段。

理解桥接模式,其实就是理解代码抽象和解耦

一、举个🌰

神话故事女娲造人大家都知道吧。来重温一遍,

据说,有一天,大神女娲行走在这片莽莽榛榛的原野上,看看周围的景象,感到非常孤独。她觉得在这天地之间,应该添一点什么东西进去,让它生气蓬勃起来才好。

添一点什么东西进去呢?

走啊走啊,她走得有些疲倦了,偶然在一个池子旁边蹲下来。澄澈的池水照见了她的面容和身影;她笑,池水里的影子也向着她笑;她假装生气,池水里的影子也向着她生气。她忽然灵机一动:“虽然,世间各种各样的生物都有了,可单单没有像自己一样的生物,那为什么不创造一种像自己一样的生物加入到世间呢?”

想着,她就顺手从池边掘起一团黄泥,掺和了水,在手里揉团着,揉团着,揉团成了第一个娃娃模样的小东西。

女娲看着她亲手创造的这个聪明美丽的生物,又听见“妈妈”的喊声,不由得满心欢喜,眉开眼笑。

她给她心爱的孩子取了一个名字,叫做“人”。

她一心要让这些美丽可爱的小生物布满大地。但是,大地毕竟太大了,她工作了许久,还没有达到她的意愿,而她本人已经疲倦不堪了。

最后,她想出了一个绝妙的创造人类的方法。她从崖壁上拉下一条枯藤,伸入一个泥潭里,搅成了浑黄的泥浆,向地面这么一挥洒,泥点溅落的地方,就出现了许多小小的叫着跳着的人儿,和先前用黄泥捏成的小人儿,模样一般无二。“妈妈”“妈妈”的喊声,震响在周围。

用这种方法来进行工作,果然简单省事。藤条一挥,就有好些活人出现,不久,大地上就布满了人类的踪迹。

在这个故事中,女娲大神创造人类用了斡旋造化的天罡神通、枯藤、息壤(黄泥)合在一起创造了人。

二、代码解析

接下里用代码层面解析一下

天道法则接口

//天道法则接口
public interface LawHeaven {

    //法则的使用
    void heavenUse();

}

斡旋造化神通(需要遵循天道法则的规范😏)

//斡旋造化
public class WoxuanZaohua implements LawHeaven{


    @Override
    public void heavenUse() {
        System.out.println("使用造化法则发动斡旋造化神通,化死为生");
    }
}

使用神通的载体

//神通载体
public abstract class UseCarrier<T> {

    // 神通
    protected LawHeaven lawHeaven;

    //使用神通的基础物质(不必须)
    protected T xiran;

    //以构造器模式注入神通和基础物质
    public  UseCarrier(LawHeaven lawHeaven ,T xiran){
        this.lawHeaven = lawHeaven;
        this.xiran = xiran;
    }

    //触发神通
   abstract String touchMagicalPower();

}

神通载体实现类 :手

public class Hand extends UseCarrier<String>{


    public Hand(LawHeaven lawHeaven, String xiran) {
        super(lawHeaven, xiran);
    }

    @Override
    String touchMagicalPower() {
        System.out.println("基础神物获得 : " + xiran);
        lawHeaven.heavenUse();
        return "得到一个人";
    }
}

神通载体实现类 :枯藤

public class WitheredVine extends UseCarrier<List<String>>{

    public WitheredVine(LawHeaven lawHeaven, List<String> xiran) {
        super(lawHeaven, xiran);
    }

    @Override
    String touchMagicalPower() {
        for (String s : xiran) {
            System.out.println("基础神物获得 : " + s);
            lawHeaven.heavenUse();
        }
        return "得到" + xiran.size() + "个人";
    }
}

调用方 : 女娲大神

public class NvWa {

    public static void main(String[] args) {
        WoxuanZaohua woxuanZaohua = new WoxuanZaohua();
        System.out.println("------------手捏---------");
        System.out.println(new Hand(woxuanZaohua, "息壤").touchMagicalPower());
        System.out.println("------------枯藤甩----------");
        System.out.println(new WitheredVine(woxuanZaohua, Arrays.asList("息壤", "息壤", "息壤", "息壤", "息壤")).touchMagicalPower());
    }

}

三、总结

看图

 

桥接模式本质上是两类不同对象的组合并完成同一个动作,其中把握好变化点(抽象类/接口)和变化点(抽象类/接口)的组合即可。例如斡旋造化神通是属于天道法则的变化点(因为天罡三十六神通都是参悟天道法则而成),手、枯藤也是属于神通载体的变化点(载体也可以是其他东西,例如树杈),然后对变化的进行组合和变化点的行为组合

对了,你是女娲大神手捏的还是枯藤甩的👀

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

群晖6.X便捷的安装cpolar内网穿透

群晖6.X便捷的安装cpolar内网穿透 文章目录 群晖6.X便捷的安装cpolar内网穿透前言1. 下载cpolar的群晖套件1.1 打开群晖套件中心1.2 选择“手动安装”1.3 选择下载cpolar套件位置 2. 打开cpolar的Web-UI界面3. 注册会员 前言 随着硬件设备和软件技术的发展&#xff0c;以及数据…

最新Ubuntu LVGL SDL模拟器安装

前言 本文主要说明Ubuntu 23.4安装LVGL 9.0以及基于SDL的模拟环境。 代码下载 访问lv_port_pc_eclipse可以看到相信信息&#xff0c;官方已经打包好了整个代码环境。 安装CMAKE。 sudo apt install cmake安装SDL。 sudo apt-get update && sudo apt-get install …

③ vue组件

vue组件创建 在App.vue中添加。 技巧&#xff1a;先import&#xff0c;把vue组件地址写出来。然后在template中写名字。剩下的就自动生成。要看下import有没有多生成什么。 注意1&#xff1a; 注意2&#xff1a; 不只是能在App.vue中引入组件。任意组件中都可以引用其他组件…

SpringBoot Thymeleaf模板引擎

Thymeleaf 模板引擎 前端交给我们的页面&#xff0c;是html页面。如果是我们以前开发&#xff0c;我们需要把他们转成jsp页面&#xff0c;jsp好处就是当我们查出一些数据转发到JSP页面以后&#xff0c;我们可以用jsp轻松实现数据的显示&#xff0c;及交互等。 jsp支持非常强大…

django处理分页

当数据库量比较大的时候一定要分页查询的 在django中操作数据库进行分页 queryset models.PrettyNum.objects.all() #查询所有 queryset models.PrettyNum.objects.all()[0:10] #查询出1-10列 queryset models.PrettyNum.objects.filter(mobile__contains136)[0:10] …

关于selenium 元素定位的浅度解析

一、By类单一属性定位 元素名称 描述 Webdriver API id id属性 driver.find_element(By.ID, "id属性值") name name属性 driver.find_element(By.NAME, "name属性值") class_name class属性 driver.find_element(By.CLASS_NAME, "class_na…

npm 报错 cb() never called!

不知道有没有跟我一样的情况&#xff0c;在使用npm i的时候一直报错&#xff1a;cb() never called! 换了很多个node版本&#xff0c;还是不行&#xff0c;无法解决这个问题 百度也只是让降低node版本请缓存&#xff0c;gpt给出的解决方案也是同样的 但是缓存清过很多次了&a…

虹科方案 | 汽车总线协议转换解决方案

汽车总线&#xff1a; 汽车总线是一种用于在车辆电子系统中传输数据和控制信息的通信系统。它允许不同的电子控制单元&#xff08;ECU&#xff09;在车辆中相互通信&#xff0c;协调各个系统的操作&#xff0c;以实现功能的集成和协同工作。 在现代汽车中&#xff0c;综合通信…

计网第一章

注意&#xff1a;计网知识点十分多&#xff0c;在本篇及后续博客主要记录个人认为比较重要的知识点。 1.计算机网络的基本概念 计算机网络就是自治的计算机互连起来的集合。计算机网络可以简称为网络&#xff0c;而互连网就是把许多网络连接起来&#xff0c;即网络的网络。 …

拆解与重构:慕云游首页组件化设计

目录 前言1 项目准备1.1 创建项目目录1.2 搭建项目开发环境 2 项目组件化2.1 在当前环境启动原有项目2.2 顶部组件2.3 幻灯片组件2.4 机酒自由行组件2.5 拆分余下的css文件 3 项目完善3.1 幻灯片组件3.1.1 结构和样式3.1.2 功能实现3.1.3 使用Ajax获取数据3.1.4 加载中组件 3.2…

0基础学习VR全景平台篇 第81篇:全景相机-临云镜如何直播推流

临云镜全景相机是阿里巴巴定制全景设备&#xff0c;实现空间三维信息的快速采集&#xff0c;与阿里云三维空间重建平台搭配&#xff0c;帮助品牌商与平台以较低的成本完成空间的快速采集&#xff0c;并支持对室内/室外空间的三维全景展示及空间漫游&#xff0c;同时支持VR浏览、…

适配器模式-java实现

意图 复用已经存在的接口&#xff0c;与所需接口不一致的类。即将一个类&#xff08;通常是旧系统中的功能类&#xff09;&#xff0c;通过适配器转化成另一个接口的实现。&#xff08;简单来说&#xff0c;就是复用旧系统的功能&#xff0c;去实现新的接口&#xff09; 我们举…

【MFC】05.MFC六大机制:程序启动机制-笔记

MFC程序开发所谓是非常简单&#xff0c;但是对于我们逆向人员来说&#xff0c;如果想要逆向MFC程序&#xff0c;那么我们就必须了解它背后的机制&#xff0c;这样我们才能够清晰地逆向出MFC程序&#xff0c;今天这篇文章就来带领大家了解MFC的第一大机制&#xff1a;程序启动机…

datax抽取库名带点的表遇到的问题

一、描述任务 使用Datax抽取mysql中的数据到hive的wedw_ods层中&#xff0c;mysql的库名为&#xff1a;b.p.n.p 表名为&#xff1a;bene_group 二、datax.json脚本生成 因为datax的脚本是自动生成的&#xff0c;生成的格式如下&#xff1a; {"core": {},"jo…

链表OJ详解

&#x1f495;人生不满百&#xff0c;常怀千岁忧&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;链表oj详解 题目一&#xff1a;移除元素 题目要求&#xff1a; 画图分析&#xff1a; 代码实现&#xff1a; struct ListNode* removeElements(struct List…

mysql数据库如何转移到oracle

mysql数据库转移到oracle 在研发过程中&#xff0c;可能会用到将表数据库中的表结构及数据迁移到另外一种数据库中&#xff0c; 比如说从mysql中迁移到oracle中&#xff0c; 常用的方法有好些&#xff0c;如下 1、使用powerdesigner&#xff0c;先连接mysql然后生成mysql的p…

【工作中问题解决实践 十一】Kafka消费者消费堆积且频繁rebalance

最近有点不走运&#xff0c;老是遇到基础服务的问题&#xff0c;还是记着点儿解决方法&#xff0c;以后再遇到快速解决吧&#xff0c;今天遇到这个问题倒不算紧急&#xff0c;但也能通过这个问题熟悉一下Kafka的配置。 问题背景 正在开会的时候突然收到一连串的报警&#xff…

Three.js 实现材质边缘通道发光效果

相关API的使用&#xff1a; 1. EffectComposer&#xff08;渲染后处理的通用框架&#xff0c;用于将多个渲染通道&#xff08;pass&#xff09;组合在一起创建特定的视觉效果&#xff09; 2. RenderPass(是用于渲染场景的通道。它将场景和相机作为输入&#xff0c;使用Three.…

Javascript异步编程的4种方法

你可能知道&#xff0c;Javascript语言的执行环境是"单线程"&#xff08;single thread&#xff09;。 所谓"单线程"&#xff0c;就是指一次只能完成一件任务。如果有多个任务&#xff0c;就必须排队&#xff0c;前面一个任务完成&#xff0c;再执行后面一…

4.深入对象

4.1创建对象三种方式 1.利用对象字面量创建对象 const obj{ name : 佩奇 }2.利用new 0bject创建对象 const obj new Object({ name: 佩奇 }) console.log(obj) // {name: 佩奇}3.利用构造函数创建对象 4.2构造函数 构造函数&#xff1a;是一种特殊的函数,主要用来初始化…