JAVA SCRIPT设计模式--结构型--设计模式之ADAPTER适配器(6)

news2024/11/19 21:27:34

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


一、UML类图

参与者:

1.1 Target(Shape)  

  • 定义Client使用的与特定领域相关的接口。

1.2 Client(DrawingEditor)

  • 与符合Target接口的对象协同。

1.3 Adaptee(TextView)

  • 定义一个已经存在的接口,这个接口需要适配。

1.4 Adapter(TextShape)

  • 对Adaptee的接口与Target接口进行适

二、意图

      将一个类的接口转换成客户希望的另外一个接口。使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

三、适用性

  1. 你想使用一个已经存在的类,而它的接口不符合你的需求。
  2. 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
  3. (仅适用于对象Adapter)你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

四、示例代码

4.1  动机

        有时,为复用而设计的工具箱类不能够被复用的原因仅仅是因为它的接口与专业应用领域所需要的接口不匹配。

        例如,有一个绘图编辑器,这个编辑器允许用户绘制和排列基本图元(线、多边型和正文等)生成图片和图表。这个绘图编辑器的关键抽象是图形对象。图形对象有一个可编辑的形状,并可以绘制自身。图形对象的接口由一个称为Shape的抽象类定义。绘图编辑器为每一种图形对象定义了一个Shape的子类:LineShape类对应于直线,PolygonShape类对应于多边型,等等。

        像LineShape和PolygonShape这样的基本几何图形的类比较容易实现,这是由于它们的绘图和编辑功能本来就很有限。但是对于可以显示和编辑正文的TextShape子类来说,实现相当困难,因为即使是基本的正文编辑也要涉及到复杂的屏幕刷新和缓冲区管理。同时,成品的用户界面工具箱可能已经提供了一个复杂的TextView类用于显示和编辑正文。理想的情况是我们可以复用这个TextView类以实现TextShape类,但是工具箱的设计者当时并没有考虑Shape的存在,因此TextView和Shape对象不能互换。

        一个应用可能会有一些类具有不同的接口并且这些接口互不兼容,在这样的应用中象TextView这样已经存在并且不相关的类如何协同工作呢?我们可以改变TextView类使它兼容Shape类的接口,但前提是必须有这个工具箱的源代码。然而即使我们得到了这些源代码,修改TextView也是没有什么意义的;因为不应该仅仅为了实现一个应用,工具箱就不得不采用一些与特定领域相关的接口。

        我们可以不用上面的方法,而定义一个TextShape类,由它来适配TextView的接口和Shape的接口。我们可以用两种方法做这件事:1)继承Shape类的接口和TextView的实现,或2)将一个TextView实例作为TextShape的组成部分,并且使用TextView的接口实现TextShape。这两种方法恰恰对应于Adapter模式的类和对象版本。我们将TextShape称之为适配器Adapter。

        本例说明了在Shape类中声明的BoundingBox请求如何被转换成在TextView类中定义的GetExtent请求。由于TextShape将TextView的接口与Shape的接口进行了匹配,因此绘图编辑器就可以复用原先并不兼容的TextView类。

        Adapter时常还要负责提供那些被匹配的类所没有提供的功能。由于绘图编辑器允许用户交互的将每一个Shape对象“拖动”到一个新的位置,而TextView设计中没有这种功能。我们可以实现TextShape类的CreateManipulator操作,从而增加这个缺少的功能,这个操作返回相应的Manipulator子类的一个实例。

        Manipulator是一个抽象类,它所描述的对象知道如何驱动Shape类响应相应的用户输入,例如将图形拖动到一个新的位置。对应于不同形状的图形,Manipulator有不同的子类;例如子类TextManipulator对应于TextShape。TextShape通过返回一个TextManipulator实例,增加了TextView中缺少而Shape需要的功能。

4.2  示例UML

 目录结构:

4.2 Target(Shape)  

  • 定义Client使用的与特定领域相关的接口。
export default  class Shape {
	
    constructor() {
    }
    BoundingBox() {  
		  
    }
    CreateManipulator() {   //返回 Manipulator //操纵者; 控制者; 设计模式----抽象方法
		 
    }
  }

4.3 Client(DrawingEditor)

  • 与符合Target接口的对象协同。
 
import Shape  from './Shape/Shape.js';
import TextShape  from './Shape/impl/TextShape.js';
import Line  from './Shape/impl/Line.js';

 
export default class DrawingEditor{
    main(){
		
		let line=new  Line();
		line.BoundingBox();
		let lineManipulator=line.CreateManipulator();
		lineManipulator.Drag();
		
	   let textShape=new  TextShape();
	   textShape.BoundingBox();
	   let textManipulator=textShape.CreateManipulator();
	   textManipulator.Drag();
    } 
 }

4.4 Adaptee(TextView)

  • 定义一个已经存在的接口,这个接口需要适配。
export default  class TextView {
	
    constructor() {
    }
    GetExtent() {  
		 console.log(` 这里的TextView 类方法被适配到了Shape 的BdoundingBox方法 `); 
    }
   
  }

4.5 Adapter(TextShape)

  • 对Adaptee的接口与Target接口进行适
import Shape  from '../Shape.js';
import TextView  from './TextView.js';
import TextManipulator  from '../../Manipulator/impl/TextManipulator.js';


export default  class TextShape extends Shape {
   #textView;//被适配的类对象
	constructor() {
		 super();
		  this.#textView=new TextView();
    }
    BoundingBox() {
    	 this.#textView.GetExtent();
    }
    CreateManipulator() {   //操纵者; 控制者;
      return new TextManipulator();
    }
    
  } 

4.6 测试HTML

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

 </script>
</head>
<body>

    
</body>
</html>

测试结果:


Line.js:11  Line 的BdoundingBox方法 
LineManipulator.js:10  TextManipulator Drag
TextView.js:6  这里的TextView 类方法被适配到了Shape 的BdoundingBox方法 
TextManipulator.js:10  TextManipulator Drag

五、源代码下载

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

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

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

相关文章

代码详细教程+文档+PPT+源码等]SSM框架网上书城全套含微信支付|电商购物计算机专业毕业论文java毕业设计网站

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 计算机毕业设计java毕设SSM框架实现的网上书城-升级版_哔哩哔哩_bilibili项目资料网址: http://itzygogogo.com软件下载地址:http://itzygogogo.co…

Spring的IOC是啥?有什么好处?

单一职责原则 依赖倒转原则 最小知识原则 接口隔离原则 合成/聚合复用原则 里氏代换原则&#xff0c;任何基类可以出现的地方&#xff0c;子类一定可以出现 依赖倒置 假设我们设计一辆汽车&#xff1a;先设计轮子&#xff0c;然后根据轮子大小设计底盘&#xff0c;接着根…

封装基板出厂100欧姆,测试85欧姆?

作者&#xff1a;一博科技高速先生成员 陈亮 封装基板&#xff08;Package Substrate&#xff09;是半导体芯片的载体。为芯片提供连接、保护、支撑、散热、组装等功效&#xff0c;以实现多引脚化&#xff0c;缩小产品体积、改善电性能及散热性、多芯片模块化等。我们生活中看…

构造HTTP请求 以及 关于HTTPS的加密

1.构造HTTP请求 构造HTTP请求有很多种方式.使用html,使用jQuery,使用socket…等等. 这里我们介绍两种. 使用html使用jQuery 1.1.使用html构造HTTP请求 使用html构造HTTP请求,要使用到 form 标签. 这里form标签中的属性有两个. action :填写数据要返送到的地址.(URL)meth…

【云原生 | Kubernetes 实战】08、零故障升级之 Pod 健康探测——启动、存活、就绪探测

目录 一、Pod容器健康探测 1.1 为什么要对容器做探测&#xff1f; 默认的健康检查 探测类型 检查机制 探测结果 Pod 探针相关的属性 两种探针区别 1.2 启动探测 startupprobe exec 模式 tcpsocket 模式 httpget 模式 1.3 存活性探测 livenessProbe 通过 exec …

C++const修饰成员函数

#include "iostream"using namespace std;//常函数class Person { public://this指针的本质 是指针常量 指针的指向是不可以修改的//const Person * const this//在成员函数后面加const&#xff0c;修饰的是this的指向&#xff0c;让指针指向的值也不可以修改void …

纤维二糖-聚乙二醇-羟基Cellobiose-PEG-OH羟基-PEG-纤维二糖

纤维二糖-聚乙二醇-羟基Cellobiose-PEG-OH羟基-PEG-纤维二糖 中文名称&#xff1a;纤维二糖-羟基 英文名称&#xff1a;Cellobiose-OH 别称&#xff1a;羟基修饰纤维二糖&#xff0c;羟基-纤维二糖 羟基&#xff08;oxhydryl&#xff09;是一种常见的极性基团&#xff0c;化…

深入场景痛点,制造业数据应用思考与实践

数字化转型是我国制造业进一步创新式发展的关键&#xff0c;决定了企业在未来生存和发展的态势。 但对于企业而言&#xff0c;如何以低耗能、低成本、高效率的方式加快制造业转型升级的步伐&#xff0c;仍然是众多制造企业需要解决的问题。 深入制造企业数字化转型的场景&…

#Spring-boot高级

一、SpringBoot 整合 Mybatis 1、SpringBoot 整合 Mybatis MyBatis 帮助我们快速集成 SpringBoot 提供的一个组件包&#xff08;mybatis-spring-boot-starter)&#xff0c;使用这个组件可以做到以下几点&#xff1a; 自动检测现有的DataSource将创建并注册SqlSessionFactory…

从工地转行网络安全工程师,工资翻了好几倍,我想和大家聊聊我的经历

成功的从工地转行到办公室办公也有一年了&#xff0c;楼主就来说说&#xff0c;从工地到白领的过渡吧&#xff0c;这其中历经艰辛&#xff0c;最终终达成目标。没错&#xff0c;楼主现在成为了一位网络安全工程师… 先说说为什么转行吧&#xff0c;身边很多做土木工程的都转行…

还在一张张打印CAD图纸吗

用CAD打印少些图纸可以一张张的打印&#xff0c;但是需要打印上百甚至上千张图纸的时候一张张打印就不知道需要用多久的打印时间了&#xff0c;那么在CAD梦想画图软件中有一个批量打印图纸的功能&#xff0c;能节约很大一部分打印时间 操作步骤 1.在网上下载CAD梦想画图 2.用…

Ansys Lumerical | 行波马赫曾德尔调制器的仿真设计与优化

说明 本案例将Lumerical和HFSS在行波MZM调制器建模中的功能与optiSLang相结合&#xff0c;提供了强大的优化能力以寻找最佳性能设计。 下载 联系工作人员获取附件 综述 本案例建立在已有的硅波导建模实例&#xff08;Ansys Lumerical 行波 Mach-Zehnder 调制器仿真分析&#x…

知乎zse-96算法-jsrpc方案

文章目录 1.git 下载exe文件2. 控制台执行JsEnv.js,建立连接3.抠取 加密js代码4. python 调用rpc临时有知乎需求,就研究了一下知乎搜索接口,发现主要是zse-96算法难,补环境又有很多坑,又想快速解决问题,就有了用jsrpc来解决的想法,后面有时间了就研究一下再发一个补环境…

JavaScript中的sessionStorage

JavaScript中的sessionStorage 该文章需要联系这篇文章学习&#xff1a;JavaScript中的localStorage 案例池子&#xff1a; JS实现鼠标悬停变色 JavaScript中的排他算法实现按钮单选 JavaScript中的localStorage JavaScript中的sessionStorage JavaScript实现网页关灯效果…

[C++]类和对象【上篇】

​ &#x1f941;作者&#xff1a; 华丞臧 &#x1f4d5;​​​​专栏&#xff1a;【C】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449;LeetCode 文章目录1.面向…

归并排序 (递归+非递归)

文章目录1. 归并排序 递归1.基本思想2. 使用两个函数完成归并3. 递归结束条件4.时间复杂度与空间复杂度计算1. 时间复杂度2. 空间复杂度5. 代码2. 归并排序 非递归1. 思想2. 越界问题1. .end1 beign2 end2 越界方式 1方式 2整体拷贝与拷贝一部分&#xff0c;归并一部分的区别2.…

数据库与身份认证:数据库的基本概念

什么是数据库 数据库&#xff08;database&#xff09;是用来组织、存储和管理数据的仓库。 当今世界是一个充满着数据的互联网世界&#xff0c;充斥着大量的数据。数据的来源有很多&#xff0c;比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据&…

【知识图谱】(task1)知识图谱概论

note 知识图谱技术要素 文章目录note一、语言与知识二、知识图谱的起源三、知识图谱的价值四、知识图谱的技术内涵4.1 知识图谱是交叉领域4.2 技术内涵&#xff08;1&#xff09;基于图的表示学习&#xff08;2&#xff09;图数据存储和查询&#xff08;3&#xff09;知识图谱…

企业庆典年会活动如何邀约媒体记者到现场报道

媒体邀约是指企业或者是公司根据其发生的公关事件&#xff0c;比如展览展会、新品上市以及合作签约等事宜&#xff0c;向特定的媒体发出邀请&#xff0c;如果邀请得到媒体的通过之后&#xff0c;那么相应的媒体就会到公司的现场进行实时采访和报道&#xff0c;之后还会在国内的…

node.js的四种内置模块

目录 1、node.js内置模块的概念 2、fs内置模块 3、path内置模块 4、url内置模块 5、http内置模块 1、node.js内置模块的概念 node.js的内置模块也叫作node.js的核心模块&#xff0c;它是node.js自带的模块&#xff0c;在下载了node.js后就会有的&#xff0c;并不需要从外…