设计模式篇---桥接模式

news2024/11/24 17:02:35

文章目录

    • 概念
    • 结构
    • 实例
    • 总结

概念

桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
毛笔和蜡笔都属于画笔,假设需要有大、中、小三种型号的画笔,绘画出12种颜色,蜡笔需要3*12=36支,毛笔需要3支毛笔+12个颜色=15个对象。当扩展一种型号的画笔时,蜡笔再需要12支,毛笔只需要一支。毛笔的这种思想的本质就是桥接模式。
颜色和型号是两个不同的变化维度,各自进行扩展理应该不影响另外一方,但蜡笔将颜色和型号糅合在了一起,这就产生了耦合,当一方发生扩展时势必要引起另一方的变动。

结构

桥接模式的结构图如下:
在这里插入图片描述
Abstraction(抽象类):用于定义抽象类的接口,其中定义了一个Implementor类型的对象。Abstraction中可以使用Implementor中的方法,通过关联的方式,而不是继承。该接口即可以包含抽象业务方法也可以包含具体业务方法;它可以理解为是毛笔。
RefinedAbstraction(扩充抽象类):它是Abstraction的实现。
Implementor(实现类接口):该接口提供一些基本的操作,并将这些基本的实现让子类来完成;它可以理解为是颜色。
ConcreteImplementor(具体实现类):它具体实现了Implementor接口,在不同的ConcreteImplementor中有不同的实现操作。

实例

现在以毛笔为例,实现它的demo
在这里插入图片描述
毛笔的抽象类

public abstract class Quill {

    protected Color color;

    protected Quill (Color color) {
        this.color = color;
    }

    public abstract void draw(Color color);
    
}

颜色的抽象类,与毛笔的抽象类是桥接关系。

public abstract class Color {

    abstract void color();
}

大号毛笔

public class BigQuill extends Quill {
    public BigQuill(Color color) {
        super(color);
    }

    @Override
    public void draw(Color color) {
        System.out.println("大号毛笔");
        color.color();
    }
}

中号毛笔

public class MediumQuill extends Quill {
    public MediumQuill(Color color) {
        super(color);
    }

    @Override
    public void draw(Color color) {
        System.out.println("中号毛笔");
        color.color();
    }
}

小号毛笔

public class SmallQuill extends Quill  {
    public SmallQuill(Color color) {
        super(color);
    }

    @Override
    public void draw(Color color) {
        System.out.println("小号毛笔");
        color.color();
    }
}

红色

public class RedColor extends Color {
    @Override
    void color() {
        System.out.println("红色");
    }
}

绿色

public class GreenColor extends Color{
    @Override
    void color() {
        System.out.println("绿色");
    }
}

黑色

public class BlackColor extends Color{
    @Override
    void color() {
        System.out.println("黑色");
    }
}

客户端

public class Client {

    public static void main(String[] args) {
        Color redColor = new RedColor();
        Quill bigQuill = new BigQuill(redColor);
        bigQuill.draw(redColor);
    }
}

总结

在使用桥接模式时应该识别出一个类具有两个独立的变化维度,就比如毛笔本身具有一个维度,需要画出颜色就需要另外一个维度–颜色,颜色本身并不属于毛笔中的属性,它和毛笔本身是一个“设置”关系,所以它也可以作为一个抽象类,和毛笔进行桥接。
桥接模式使用的场景:
1、如果一个系统需要在抽象化和具体化之间增加更多的灵活性,可以考虑通过桥接模式使它们建立一个抽象的管理关系。
2、抽象部分和被“设置”部分可以通过继承的方式独立扩展而不相互影响。
3、一个类存在多个独立的变化维度,而这些维度需要独立的进行扩展。
4、不希望因为使用继承或多重继承而导致类的个数急剧增加的系统。

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

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

相关文章

大数据之Flume

Flume概述 一个高可用(稳定),高可靠(稳定),分布式的海量日志采集,聚合和传输的系统。Flume基于流式架构,灵活简单。日志文件即txt文件,不能传输音频,视频&am…

【狼疮抗凝物-- 抗心磷脂抗体】

狼疮抗凝物属于易栓症的一种. 狼疮抗凝物 (Lupus Anticoagulant LAC)是一种作用于磷脂的IgG或IgM的抗磷脂抗体,在体内和体外 凝血试验中,磷脂对凝血酶原酶复合体活化起模板作用。狼疮抗凝物是抗磷脂的成分的抗 体,在多…

消息队列中,如何保证消息的顺序性?

本文选自:advanced-java 作者:yanglbme 问:如何保证消息的顺序性? 面试官心理分析 其实这个也是用 MQ 的时候必问的话题,第一看看你了不了解顺序这个事儿?第二看看你有没有办法保证消息是有顺序的&#xf…

大范围XSS扫描工具:XSS-Freak,BurpSuite随机用户代理,Hades 静态代码审核系统

大范围XSS扫描工具:XSS-Freak,BurpSuite随机用户代理,Hades 静态代码审核系统。 #################### 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具,支持研究学习…

华为云云耀云服务器L实例评测|centos7.9 配置python虚拟环境 运行django

文章目录 ⭐前言⭐安装python💖 wget下载💖 选择安装位置 ⭐pip安装虚拟环境💖 pip3安装 virtualenv💖 创建目录存放python虚拟环境 ⭐安装django💖 指定端口运行django💖 远程访问 ⭐总结⭐结束 ⭐前言 大…

STL函数对象和谓词

目录 函数对象 谓词 函数对象 概念: 重载函数调用操作符的类,其对象常称为函数对象 函数对象使用重载的()时,行为类似函数调用,也叫仿函数 本质: 函数对象(仿函数)是一个类,不是一个函数 特点: …

Linux进程创建、进程终止、进程等待、进程程序替换

目录 进程创建fork函数fork函数返回值fork创建子进程的目的之一fork调用失败的原因写实拷贝 进程终止进程执行结果进程退出码进程终止的理解进程的退出方式 进程等待进程等待的必要性进程等待的概念wait方法获取子进程status 进程程序替换替换原理替换函数函数解释命名理解单进…

深度学习自学笔记六:深层神经网络

一、深层神经网络概述 深层神经网络(Deep Neural Networks,DNN)是一种机器学习模型,由多个神经网络层组成。与传统的浅层神经网络相比,深层神经网络具有更多的隐藏层,使其能够进行更复杂、更抽象的特征学习…

【07】FISCOBCOS一键部署前的准备工作ubuntu安装,mysql,python,PyMySQL,java

官方文档最下面https://webasedoc.readthedocs.io/zh_CN/latest/docs/WeBASE/install.html JAVA已经安装好了,可以看控制台那篇文章【03】 安装mysql 下载并解压mysql sudo apt install -y mysql-server mysql-client libmysqlclient-dev安装 MySQL 服务器、MySQL 客户端和…

【C/C++笔试练习】——printf在使用%的注意事项、for循环语句的三个条件、运算符优先级、删除公共字符

文章目录 C/C笔试练习1.%符号在printf用作格式说明符的注意事项(1)输出%5.3s(2)判断%中小数点含义 2.for循环语句的三个条件(3)判断循环次数(4)判断循环次数 3.运算符优先级&#xf…

交换奇偶位:交换一个整数的二进制的奇偶位置(仅考虑正数情况)

方法二: 设计思想: 0xAAAAAAAA 的二进制表示为 10101010...(从最低位开始) 0x55555555 的二进制表示为 01010101...(从最低位开始) 问题:更加想不到掩码!!&#xf…

JVM——11.JVM小结

这篇文章我们来小结一下JVM JVM,即java虚拟机,是java代码运行时的环境。我们从底层往上层来说,分别是硬件部分,操作系统,JVM,jre,JDK,java代码。JVM是直接与操作系统打交道的。JVM也…

数据结构:二叉树的基本概念

文章目录 1. 二叉树的定义2. 二叉树的特点3. 特殊二叉树斜树满二叉树完全二叉树 4. 二叉树的性质 1. 二叉树的定义 如果我们猜一个100以内的数字,该怎么猜才能理论最快呢? 第一种方式:从1,2一直猜到100, 反正数字都是100以内,总能猜到的 第二种方式:先猜50,如果比结果小,猜75…

【WPF】填坑 - WindowChrome 自定义窗口完美实现

【WPF】填坑 - WindowChrome 自定义窗口完美实现 概述Demo 说明基本样式资源布局ShellView Style界面元素修正Command BindingCommand 实现 效果 概述 前面写过一篇关于在 WPF 中通过对 WindowChrome 的操作实现自定义窗口并保留一部分的系统功能。 【WPF】WindowChrome 自定义…

虚幻4学习笔记(13)用户UI 交互动画、制作2D UI、制作3D UI

虚幻4学习笔记 制作2D UIUI 主菜单制作UI动画 和 暂停游戏 制作3D UI B站UP谌嘉诚课程:https://www.bilibili.com/video/BV164411Y732 制作2D UI 导入图片 新建 用户界面-控件蓝图 双击打开 拖入image 参数设置 SizeX1920 SizeY1080 选择对焦居中点 右下角平铺 参…

【Acwing1027】方格取数(动态规划)题解

题目描述 思路分析 错误思路: 贪心法,先走一次求出最大值,把走过的路上面的数值清零,然后用同样的方法再走一遍求最大值,然后让这两个最大值相加就是最后的结果。 很多人在看到这个题目的时候会有上面的思路&#x…

微信小程序开发学习

模板与绑定 1.数据绑定 1)在data中定义数据 在页面对应的.js文件中把数据定义到data对象中即可 2)在WXML中使用数据 把data中的数据绑定到页面中渲染,使用Mustache(双大括号{{}})将变量名包起来即可,格式…

AHK c++ 禁用鼠标设备实现完美息屏(不是休眠)

如何实现完美息屏呢?虽然可以用ahk实现息屏,但桌子一晃动,鼠标稍微偏移一下,又亮了,导致息屏无效! win10 更新了设备管理器,现在可以禁用鼠标设备了。以前这里是灰色的。 c 禁用鼠标 那么&…

第二章 进程与线程 十七、用信号量实现进程互斥、进程同步、进程的前驱关系

一、实现进程互斥 1、过程 (1)分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问就应放在临界区) (2)设置互斥信号量mutex,初值为1 (3)在进入区P(mutex)…

网工基础知识——以太网

1972年Bob Metcalfe“以太网之父”被Xerox雇佣为网络专家,Bob Metcalfe 来到Xerox公司的Palo Alto研究中心(PARC)的第一个任务是把Palo Alto的计算机连接到ARPANET(Internet的前身)上。1972年底Bob Metcalfe以ALOHA系统…