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

文章目录

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

概念

桥接模式:将抽象部分与它的实现部分解耦,使得两者都能够独立变化。
毛笔和蜡笔都属于画笔,假设需要有大、中、小三种型号的画笔,绘画出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);}@Overridepublic void draw(Color color) {System.out.println("大号毛笔");color.color();}
}

中号毛笔

public class MediumQuill extends Quill {public MediumQuill(Color color) {super(color);}@Overridepublic void draw(Color color) {System.out.println("中号毛笔");color.color();}
}

小号毛笔

public class SmallQuill extends Quill  {public SmallQuill(Color color) {super(color);}@Overridepublic void draw(Color color) {System.out.println("小号毛笔");color.color();}
}

红色

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

绿色

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

黑色

public class BlackColor extends Color{@Overridevoid 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.mzph.cn/news/87476.shtml

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

相关文章

Unity当中的灯光类型

文章目录 前言一、Directional平行光二、Point点灯三、Spot 聚光灯四、Area面光灯,只用于烘培 前言 Unity当中的灯光类型 一、Directional平行光 Unity当中最重要的灯管类型,类似现实中的太阳光 二、Point点灯 类似现实中的灯泡,萤火虫&a…

java版网页代码生成器系统myeclipse定制开发mysql数据库网页模式java编程jdbc生成无框架java web网页

一、源码特点 java版网页代码生成器系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0,使…

力扣:105. 从前序与中序遍历序列构造二叉树(Python3)

题目: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 来源:力扣(LeetCode) 链接:力扣&am…

指针笔试题讲解

文章目录 题目答案与解析1、234、5、6、7、8、 题目 int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; }//由于还没学习结构体,这里告知结构体的大小是20个字节 //由于还没学习结…

第十二届钧瓷文化旅游节主题曲:让世界看见钧瓷的魅力

下面大禹智库是以产业,古镇,营销为主题专门为第十二届钧瓷文化旅游节创作的《让世界看见钧瓷的魅力》的歌词。 编辑搜图 古镇千年的沉淀,窑火燃烧的传说 传承着古老的技艺,匠人们用心铸就 钧瓷的魅力,吸引着世界的目光 这里的风景,如诗如画,如梦如幻 编辑搜图 钧瓷文…

QT程序打包图片无法正常显示

QT程序打包图片无法正常显示 环境: QT4.8.2VS2017opencv3.416 问题: 本机测试正常,图片可正常显示功能也可正常进行,但打包发送给没有环境数据的电脑上进行测试就会出现图片无法显示的问题。 原因: 并没有找到理论支撑…

代码随想录第34天 | 343. 整数拆分 96.不同的二叉搜索树

343. 整数拆分 /*** param {number} n* return {number}*/ var integerBreak function(n) {let dpnew Array(n1)dp.fill(1)for(let i3;i<n;i)for(let j1;j<i/2;j){dp[i] max(dp[i],max(j*(i-j),dp[i-j]*j))} function max(a,b){return a>b?a:b }return dp[n] }; 想…

Linxu下c语言实现socket+openssl数据传输加密

文章目录 1. Socket连接建立流程2、SocketSSL的初始化流程3、初始化SSL环境&#xff0c;证书和密钥4、SocketSSL 的c语言实现4.1 编写SSL连接函数4.2 编写加密服务端server.c4.3 编写加密客户端client.c 5、使用tcpdump检验源码获取 在进行网络编程的时候&#xff0c;我们通常使…

体育运动模板推荐

最近的朋友圈一半是晒国庆城市布置的美景的&#xff0c;一半当然就是杭州亚运会了。目前杭州亚运会正在如火如荼的进行中&#xff0c;绝美的开幕式&#xff0c;运动健儿们奋力拼搏的精神&#xff0c;在杭州亚运会的舞台上&#xff0c;每个人都是独一无二的英雄。亚运会的舞台&a…

C语言学习(1)—— 环境安装和配置

运行C语言和C程序需要安装MinGW和VSCode。 一. 安装MinGW 1、进入官网下载MinGW&#xff1a;https://sourceforge.net/projects/mingw-w64/files/ 2、解压缩 3、配置环境变量 4、检查是否安装成功 二. 安装VSCode 1、进入官网下载VSCode&#xff1a;https://code.visualstud…

Frp内网穿透

Frp简介 Frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。 Frp工作原理&#xff1a; 服务端运行&#xff0c;监听一个主端口&#xff0c;等待…

如何扫描MSI安装文件的路径

今天有个需求&#xff0c;需要扫描已经安装应用, 其中有个华云桌面 其中的UninstallString 值是 MsiExec.exe /X{D20A661B-0CBA-4DE3-A1F6-353D8153725D} 无法直接获取其安装目录&#xff0c; MsiGetProductInfoW 等API INSTALLPROPERTY_INSTALLLOCATION 也不好使 自己写一个…

YTM32的LINFlexD实现UART功能详解

文章目录 引言简介原理与机制同UART模式相关的寄存器时钟与波特率数据缓冲区发送过程接收过程 软件参考文献 引言 初看YTM32B1ME的手册时&#xff0c;一眼看上去&#xff0c;竟然没有找到UART模块的章节&#xff0c;心想这车规MCU的产品定义也太激进了&#xff0c;直接把工业和…

Vue之vue-cli搭建SPA项目

目录 ​编辑 前言 一、vue-cli简介 1. 什么是vue-cli 2. vue-cli的重要性 3. vue-cli的应用场景 二、Vue-cli搭建SPA项目 1. 构建前提&#xff08;node.js安装完成&#xff09; 2. 安装vue-cli 3. 使用脚手架vue-cli(2.X版)来构建项目 4. 分析创建spa项目的八个问题 …

Rust 学习笔记

Rust 学习笔记 Hello world 代码一 fn main() { // 在这里编写你的 Rust 代码 println!("Hello world!"); } 什么是Rust 语言&#xff1f; Rust是一门系统编写语言 &#xff0c;专注于安全 &#xff0c;尤其是并发安全&#xff0c;支持函数式和命令式等编程…

基于规则架构-架构案例2019(三十九)

电子商务 某电子商务公司为了更好地管理用户&#xff0c;提升企业销售业绩&#xff0c;拟开发一套用户管理系统。该系统的基本功能是根据用户的消费级别、消费历史、信用情况等指标将用户划分为不同的等级&#xff0c;并针对不同等级的用户提供相应的折扣方案。在需求分析与架…

计算机网络相关知识点(二)

TCP如何保证传输过程的可靠性&#xff1f; 校验和&#xff1a;发送方在发送数据之前计算校验和&#xff0c;接收方收到数据之后同样需要计算&#xff0c;如果不一致&#xff0c;那么代表传输有问题。 确认应答序&#xff0c;序列号&#xff1a;TCP进行传输时数据都进行了编号…

Vue2+ElementUI 静态首页案例

源码 <template><div class"app-container home"><el-row type"flex" justify"space-around" class"row-bg"><el-card class"box-card cardDiv1"><el-col :span"5"><div clas…

【设计模式】四、工厂模式

文章目录 概述工厂模式简单工厂模式&#xff1a;工厂方法模式抽象工厂模式小结 概述工厂模式 传统方式&#xff1a; 简单工厂模式&#xff1a; 简单工厂模式的设计方案: 定义一个可以实例化 Pizaa 对象的类&#xff0c;封装创建对象的代码。 存在的问题&#xff1a; 简单工厂…

肠道微生物可改善围手术期和术后康复效果

谷禾健康 手术&#xff0c;俗称开刀&#xff0c;是医生通过医疗器械对病人身体局部进行去除病变组织、修复损伤等治疗&#xff0c;来维持患者的健康&#xff0c;在治愈疾病方面具有明确的作用。 围手术期是指从手术决策到手术结束及术后恢复期的整个时间段。围手术期管理的目标…