JAVA SCRIPT设计模式--结构型--设计模式之Bridge桥接模式(7)

news2024/11/18 17:46:18

         JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C++,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代表全部的正确,特此声明。若读者需要了解设计模式目录、原则、设计变化方向,环境相关等信息请查看设计模式开篇。


一、UML类图

参与者:

1.1 Abstraction(Window)

  • 定义抽象类的接口。
  • 维护一个指向Implementor类型对象的指针。

1.2 RefinedAbstraction(IconWindow)

  • 扩充由Abstraction定义的接口。

1.3 Implementor(WindowImp)

  • 定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。

1.4 ConcreteImplementor(XwindowImp,PMWindowImp)

  • 实现Implementor接口并定义它的具体实现。

二、意图

     将抽象部分与它的实现部分分离,使它们都可以独立地变化。

三、适用性

  1. 你不希望在抽象和它的实现部分之间有一个固定的绑定关系。例如这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切换。
  2. 类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充。这时Bridge模式使你可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充。。
  3. 对一个抽象的实现部分的修改应对客户不产生影响,即客户的代码不必重新编译。
  4. (C++)你想对客户完全隐藏抽象的实现部分。在C++中,类的表示在类接口中是可见的。

四、优点和缺点

        Bridge模式有以下一些优点:

  1. 分离接口及其实现部分一个实现未必不变地绑定在一个接口上。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的实现。将Abstraction与Implementor分离有助于降低对实现部分编译时刻的依赖性,当改变一个实现类时,并不需要重新编译Abstraction类和它的客户程序。为了保证一个类库的不同版本之间的二进制兼容性,一定要有这个性质。另外,接口与实现分离有助于分层,从而产生更好的结构化系统,系统的高层部分仅需知道Abstraction和Implementor即可。
  2. 提高可扩充性你可以独立地对Abstraction和Implementor层次结构进行扩充。
  3. 实现细节对客户透明你可以对客户隐藏实现细节,例如共享Implementor对象以及相应的引用计数机制(如果有的话)。

五、示例代码

5.1  动机

         当一个抽象可能有多个实现时,通常用继承来协调它们。抽象类定义对该抽象的接口,而具体的子类则用不同方式加以实现。但是此方法有时不够灵活。继承机制将抽象部分与它
的实现部分固定在一起,使得难以对抽象部分和实现部分独立地进行修改、扩充和重用
        让我们考虑在一个用户界面工具箱中,一个可移植的Window抽象部分的实现。例如,这一抽象部分应该允许用户开发一些在X Window System和IBM的Presentation Manager(PM)系
统中都可以使用的应用程序。运用继承机制,我们可以定义Window抽象类和它的两个子类XWindow与PMWindow,由它们分别实现不同系统平台上的Window界面。但是继承机制有两个不足之处:

  1. 扩展Window抽象使之适用于不同种类的窗口或新的系统平台很不方便。假设有Window的一个子类IconWindow,它专门将Window抽象用于图标处理。为了使IconWindow支持两个系统平台,我们必须实现两个新类XIconWindow和PMIconWindow,更为糟糕的是,我们不得不为每一种类型的窗口都定义两个类。而为了支持第三个系统平台我们还必须为每一种窗口定义一个新的Window子类,如下图所示。
  2. 继承机制使得客户代码与平台相关。每当客户创建一个窗口时,必须要实例化一个具体的类,这个类有特定的实现部分。例如,创建Xwindow对象会将Window抽象与XWindow的实现部分绑定起来,这使得客户程序依赖于XWindow的实现部分。这将使得很难将客户代码移植到其他平台上去。

         客户在创建窗口时应该不涉及到其具体实现部分。仅仅是窗口的实现部分依赖于应用运行的平台。这样客户代码在创建窗口时就不应涉及到特定的平台。

        Bridge模式解决以上问题的方法是,将Window抽象和它的实现部分分别放在独立的类层次结构中。其中一个类层次结构针对窗口接口(Window、IconWindow、TransientWindow 临时),
另外一个独立的类层次结构针对平台相关的窗口实现部分,这个类层次结构的根类为WindowImp。例如XwindowImp子类提供了一个基于XWindow系统的实现,如下页上图所示。

        对Window子类的所有操作都是用WindowImp接口中的抽象操作实现的。这就将窗口的抽象与系统平台相关的实现部分分离开来。因此,我们将Window与WindowImp之间的关系称之
为桥接
,因为它在抽象类与它的实现之间起到了桥梁作用,使它们可以独立地变化。

5.2  示例UML

目录结构:

5.2 Abstraction(Window)

  • 定义抽象类的接口。
  • 维护一个指向Implementor类型对象的指针。
import  WindowImp from '../WindowImp/WindowImp.js';

export default  class Window {
	windowImp;
    constructor(windowImp) {
		this.windowImp=windowImp;
    }
	
    DrawText() {  
		this.windowImp.DevDrawText();  
    }
	
	DrawRect() {
		console.log(` Window 的DrawRect方法 `);   
		this.windowImp.DevDrawLine();
		this.windowImp.DevDrawLine();
		this.windowImp.DevDrawLine();
		this.windowImp.DevDrawLine();
	}
    
  }

5.3 RefinedAbstraction(IconWindow)

  • 扩充由Abstraction定义的接口。
import Window  from '../Window.js';
 
export default  class IconWindow extends Window {
   
	constructor(windowImp) {
		 super(windowImp);
    }
   DrawBorder() {
   	   this.DrawText();
	   this.DrawRect();
   }
    
    
  } 

5.4 Implementor(WindowImp)

  • 定义实现类的接口,该接口不一定要与Abstraction的接口完全一致;事实上这两个接口可以完全不同。一般来讲,Implementor接口仅提供基本操作,而Abstraction则定义了基于这些基本操作的较高层次的操作。
export default  class WindowImp {
	
    constructor() {
    }
    DevDrawText() {  
		  
    }
    DevDrawRect() {    
		 
    }
  }

5.5 ConcreteImplementor(XwindowImp,PMWindowImp)

  • 实现Implementor接口并定义它的具体实现。
import WindowImp  from '../WindowImp.js';
 
export default  class XWindowImp extends WindowImp {
   
	constructor() {
		 super();
    }
    DevDrawText() {
    	 console.log(` XWindowImp 的DevDrawText方法 `);   
    }
    DevDrawLine() {    
       console.log(` XWindowImp 的DevDrawLine方法 `);   
    }
    
  } 

5.6 Client

import Window  from './Window/Window.js';
import IconWindow  from './Window/impl/IconWindow.js';
import TranslentWindow  from './Window/impl/TranslentWindow.js';
import XWindowImp  from './WindowImp/impl/XWindowImp.js';
 
export default class Client{
    main(){
	    let iconwindow =new IconWindow(new XWindowImp() );//Window
		let tranwindow =new TranslentWindow(new XWindowImp() );//Window 
		iconwindow.DrawBorder();
		tranwindow.DrawCloseBox();
    } 
 }

5.7 测试HTML

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
 
 
 <script  type="module" >
 import Client  from './Client.js'; 
 
let cl=new Client();
cl.main()

 </script>
</head>
<body>

    
</body>
</html>

测试结果:

XWindowImp.js:9  XWindowImp 的DevDrawText方法 
Window.js:14  Window 的DrawRect方法 
XWindowImp.js:12  XWindowImp 的DevDrawLine方法 
XWindowImp.js:12  XWindowImp 的DevDrawLine方法 
XWindowImp.js:12  XWindowImp 的DevDrawLine方法 
XWindowImp.js:12  XWindowImp 的DevDrawLine方法 
Window.js:14  Window 的DrawRect方法 
XWindowImp.js:12  XWindowImp 的DevDrawLine方法 
XWindowImp.js:12  XWindowImp 的DevDrawLine方法 
XWindowImp.js:12  XWindowImp 的DevDrawLine方法 
XWindowImp.js:12  XWindowImp 的DevDrawLine方法 

六、源代码下载

        下载链接:https://pan.baidu.com/s/1XuPqp84cccBNVkbnMY3sKw 
         提取码:q2ut

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

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

相关文章

Linux 之七 内核架构、API/ABI 介绍、文件层次结构、Kernel 源码文件

Linux 内核最早是在 1991 年由芬兰大学生林纳斯托瓦兹为自己的个人电脑开发的&#xff0c;并在 GNU 通用公共许可证第 2 版&#xff08;也包含了其他兼容许可证&#xff09;之下发布的一种开源的类 Unix 操作系统宏内核。 注意&#xff0c;我们通常说的 Linux 系统是 Linux Ker…

FineReport数据图表制作教程-密码控件

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 -- 1.2 应用场景 1.2.1 填报控件 填报报表中可以通过该控件输入密码信息&#xff0c;录入密码&#xff0c;如下图所示&#xff1a; 1.2.2 参数控件 参数面板处可以通过该控件输入密码信息&#xff0c;键入查询参数&#…

WebRTC GCC 拥塞控制算法(TFB-GCC)

目录 一. 前言 二. TFB-GCC原理 1. 接收端记录并反馈收包情况 &#xff08;1&#xff09;transport-wide sequence nunmber &#xff08;2&#xff09;RTCP RTPFB TW 报文 2. 发送端结合包接收反馈情况进行带宽预估拥塞控制 &#xff08;1&#xff09;基于延时梯度的带宽…

新手必看!jenkins邮件发送配置,一教就会!

最近刚学习jenkins&#xff0c;在配置邮件发送的时候&#xff0c;踩了很多坑&#xff0c;各种百度查询&#xff0c;调试了大半天&#xff0c;终于成功解决 &#xff01;特此记录&#xff01; 遇到最让我头痛的问题&#xff0c;就是明明控制台显示邮件发送成功&#xff0c;但是…

【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用的解决方案)

【STM32笔记】HAL库低功耗模式配置&#xff08;ADC唤醒无法使用的解决方案&#xff09; 理论转载&#xff1a; leung-manwah.blog.csdn.net/article/details/114675725 一、低功耗模式简介 系统提供了多个低功耗模式&#xff0c;可在 CPU 不需要运行时&#xff08;例如等待外…

Python实现PSO粒子群优化循环神经网络LSTM分类模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法&#xff08;Particle Swarm Optimization&#xff09;的英文缩写&#xff0c;是一…

配置别名 配置alias

Linux: ~/.bashrc MAC bash 的配置文件是 ~/.bash_profile zsh的配置文件是~/.zsh 查看一下你的shell类型 terminal->performance->shells open with 方案是 1. 创建新的文件存放alias cd ~ vi .myalias edit .myalias esc :wq保存 2. add config to ~/.zshrc …

Java数据结构与Java算法学习Day09---并查集(简略笔记记录)

目录 并查集的功能&#xff1a; 1.1并查集结构 136 1.2并查集API设计 137 1.3并查集代码的实现 137 1.3.1UF&#xff08;int N&#xff09;构造方法实现 1.3.2并查集代码测试 138 1.4并查集应用案例 139 1.5UF_Tree算法优化 139 1.5.1UF_tree API设计 1.5.2优化后的…

git基本操作

目录 1 git命令与状态 1.1 常用git命令 1.2 不那么常用的git命令 1.3 常见状态 2 一些概念 2.1 版本控制 2.2 git简介 2.3 开源许可协议 3 常见git操作 3.1 下载git 3.2 安装git 3.3 配置用户信息 3.4 初始化仓库 3.5 查看git仓库状态 3.6 将文件…

手机软件测试用例设计

实例讲解手机软件测试用例设计 实例讲解手机软件测试用例设计,测试伴随在整个手机软件开发的各个阶段中&#xff0c;测试质量的高低直接关系到手机软件的可用性&#xff0c;友好性&#xff0c;可靠性。可以说&#xff0c;测试环节是手机软件开发的重要环节&#xff0c;是整个开…

JavaScript大作业:基于HTML实现紫色化妆品包装设计公司企业网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Linux与Nginx

Linux 一、Linux的概述&#xff1a; Linux是基于Unix的&#xff0c;Linux是一种自由和开放源码的操作系统&#xff0c;存在着许多不同的Linux版本&#xff0c;但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中&#xff0c;比如手机、平板电脑、路由器、台式计算机…

前端学习教程-SVG描边属性

前端学习教程-SVG描边属性&#xff0c;SVG提供了大量的笔画属性&#xff0c;实现各种各样的描边效果。我们来介绍一下&#xff1a; stroke&#xff1a;笔画属性&#xff0c; stroke-width&#xff1a;笔画宽度属性&#xff0c; stroke-linecap&#xff1a;笔画线帽属性&…

一文读懂如何使用PyCharm为飞桨提PR

本文以使用PyCharm进行飞桨中文文档修复为例&#xff0c;详细介绍了如何给飞桨提交PR&#xff08;Pull Request&#xff09;。 背景介绍 关于飞桨框架 飞桨框架是一个开源深度学习框架&#xff0c;源代码公开在GitHub上的PaddlePaddle中。该目录下包括飞桨核心框架代码库Pa…

51单片机——IO拓展(串转并)-74HC595 小白详解

74HC595 芯片介绍 74HC595 是一个 8 位串行输入、并行输出的位移缓存器&#xff0c;其中并行输出为三 态输出&#xff08;即高电平、低电平和高阻抗&#xff09;。芯片管脚及功能说明如下&#xff1a;图1 上面两张都是 74HC595 芯片管脚图&#xff0c;细心的朋友就会发现左侧的…

python+django在线考试系统39n99

目 录 目 录 III 第一章 概述 1 1.1 研究背景 1 1.2 开发意义 1 1.3 研究现状 1 1.4 研究内容 2 1.5 论文结构 2 第二章 开发技术介绍 1 第三章 系统分析 1 3.1 可行性分析 1 3.1.1 技术可行性 1 3.1.2 操作可行性 1 3.1.3 经济可行性 …

STM32频率测量

频率测量是个最基本的且常见的工业需求. 但是这种简单的需求却不是那么的好实现. 总体来看, 目前的单片机还是有很大的改进空间. 很少有频率测量能够覆盖所有的频率范围. 而使用 STM32F103 性能有限. 根据待测频率, 我分成低中高, 三个阶段. 分别对应着3种不同的测量方法. 低频…

springboot 协同办公OA管理系统源码带文字安装教程【免费分享】

Java协同办公OA管理系统源码带文字安装教程 文末获取源码&#xff01; 框架&#xff1a;springboot freemark jpa mybatis mysql 环境&#xff1a;jdk8 mysql5.7 IntelliJ IDEA maven nginx 宝塔面板 这是一套OA办公系统&#xff0c;使用Maven作项目管理&#xff0c;基…

NETCAD GIS快速而简单的搜索引擎

NETCAD GIS快速而简单的搜索引擎 NETCAD GIS是一种支持国际标准的CAD和GIS软件&#xff0c;旨在为用户设计和使用地理信息系统。它还提供了CAD、GIS和光栅与未来的强大连接。 该程序也是一个快速而简单的搜索引擎&#xff0c;只能通过向查看器键入几个单词来访问&#xff0c;并…

嵌入式开发学习之--中断应用概览

文章目录前言一、什么是NVIC1.1NVIC 简介1.2 NVIC 寄存器简介二、中断优先级2.1优先级定义2.2优先级分组三、中断编程总结前言 中断是系统逻辑十分常用的&#xff0c;学好中断&#xff0c;以及中断优先级的合理配置&#xff0c;才能使自己的项目更加稳定。 提示&#xff1a;以…