设计模式-结构型模式之适配器设计模式

文章目录

    • 一、结构型设计模式
    • 二、适配器模式

一、结构型设计模式

这篇文章我们来讲解下结构型设计模式,结构型设计模式,主要处理类或对象的组合关系,为如何设计类以形成更大的结构提供指南。

结构型设计模式包括:适配器模式(Adapter Pattern)、桥接模式(Bridge Pattern)、组合模式(Composite Pattern)、装饰器模式(Decorator Pattern)、外观模式(Facade Pattern)、享元模式(Flyweight Pattern)、代理模式(Proxy Pattern)

在本文中主要介绍 适配器、桥接、组合、享元四种设计模式,下篇文章为讲解 外观、代理、 装饰器 。

二、适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。它结合了两个独立接口的功能。
优点:

  1. 可以让任何两个没有关联的类一起运行。
  2. 提高了类的复用。
  3. 增加了类的透明度。
  4. 灵活性好。

这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,在视频播放器中,假设视频播放器只能播放MP4格式的视频,那现在又有个VLC格式的视频,就不能播放了,那要如何解决这个问题?如果我们做个转换器,将VLC格式的视频转换为MP4格式的视频不就可以播放了吗,那这个转换器我们就可以采用适配器设计模式来设计。

下面使用程序演示下上面的例子:

  1. 定义视频接口
public interface VideoInterFace {String getVideoPath();
}
  1. 定时Mp4格式视频实例
public class Mp4Video implements VideoInterFace {@Overridepublic String getVideoPath() {return "Mp4视频的路径";}
}
  1. 定义VLC格式视频实例
public class VlcVideo implements VideoInterFace{@Overridepublic String getVideoPath() {return "Vlc视频的路径";}
}
  1. 定义播放器,只接口Mp4格式的视频
public class Player {private Mp4Video video;public Player(Mp4Video video) {this.video = video;}public void play() {System.out.println(StringFormatter.concat("播放视频视频地址:", video.getVideoPath()).getValue());}
}
  1. 需要播放VLC格式的视频,定义Mp4的适配器,并接收VLC格式视频,进行转码。
public class Mp4Adapter extends Mp4Video {private VlcVideo vlcVideo;public Mp4Adapter(VlcVideo vlcVideo) {this.vlcVideo = vlcVideo;}@Overridepublic String getVideoPath() {System.out.println(StringFormatter.concat("开始格式转换,vlc地址:", vlcVideo.getVideoPath()).getValue());return "转换后的Mp4路径!";}
}
  1. 测试
public class demo {public static void main(String[] args) {Player player = new Player(new Mp4Video());player.play();VlcVideo vlcVideo = new VlcVideo();Player player1 = new Player(new Mp4Adapter(vlcVideo));player1.play();}
}

在这里插入图片描述

从上面的例子可以看出,需要播放VLC格式,就需要写一个目标适配器,这里是Mp4适配器,并继承Mp4,使之有Mp4的特性,并在内部做相应的转换即可,提高了系统的可扩展性。

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

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

相关文章

Day04:每日一题:2661. 找出叠涂元素

2661. 找出叠涂元素 给你一个下标从 0 开始的整数数组 arr 和一个 m x n 的整数 矩阵 mat 。 arr 和 mat 都包含范围 [1,m * n] 内的 所有 整数。从下标 0 开始遍历 arr 中的每个下标 i ,并将包含整数 arr[i] 的 mat 单元格涂色。请你找出 arr 中在 mat…

linux 磁盘管理、分区管理常用命令

文章目录 基础命令挂载新硬盘/分区添加内存交换分区swaplvm分区管理模式 基础命令 查看目录文件大小 du -sh /backup du -sh /backup/* du -sh *查看磁盘挂载信息 df -lhT查看某个目录挂载在哪个分区,以及分区的磁盘使用情况 df [目录] #例如:df /ho…

Scrapy爬虫异步框架之持久化存储(一篇文章齐全)

1、Scrapy框架初识(点击前往查阅) 2、Scrapy框架持久化存储 3、Scrapy框架内置管道(点击前往查阅) 4、Scrapy框架中间件(点击前往查阅) 5、Scrapy框架全站、分布式、增量式爬虫 Scrapy 是一个开源的、…

对于Web标准以及W3C的理解、对viewport的理解、xhtml和html有什么区别?

1、对于Web标准以及W3C的理解 Web标准 Web标准简单来说可以分为结构、表现、行为。 其中结构是由HTML各种标签组成,简单来说就是body里面写入标签是为了页面的结构。 表现指的是CSS层叠样式表,通过CSS可以让我们的页面结构标签更具美感。 行为指的是…

【Python表白系列】这个情人节送她一个漂浮的爱心吧(完整代码)

文章目录 漂浮的爱心环境需求完整代码详细分析系列文章 漂浮的爱心 环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这…

c/c++概念辨析-指针常量常量指针、指针函数函数指针、指针数组数组指针

概念澄清: 统一规则: 不管是XX指针,还是指针XX,后者是本体,前者只是个定语,前者也可以替换为其他同类(例如字符串),帮助理解。 XX指针: 可简单理解为&#…

基于helm的方式在k8s集群中部署gitlab - 部署(一)

文章目录 1. 背景说明2. 你可以学到什么?3. 前置条件4. 安装docker服务(所有节点)5. 部署k8s集群5.1 系统配置(所有节点)5.2 安装kubelet组件(所有节点)5.2.1 编写kubelet源5.2.2 安装kubelet5.2.3 启动kubelet 5.3 集…

从零开始,用Docker-compose打造SkyWalking、Elasticsearch和Spring Cloud的完美融合

🎏:你只管努力,剩下的交给时间 🏠 :小破站 "从零开始,用Docker-compose打造SkyWalking、Elasticsearch和Spring Cloud的完美融合 前言准备工作编写docker-compose.yml文件为什么使用本机ip为什么skywa…

python中的字符串

字符串 字符串是编程语言中的一种基本数据类型,用于表示一串字符序列。在Python中,字符串是不可变的,也就是说一旦字符串被创建,就无法修改其中的字符。 Python中的字符串可以用单引号或双引号括起来,例如&#xff1…

【LeetCode】 160. 相交链表

相交链表 题目题解 题目 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意&am…

卡码网15 .链表的基本操作III

链表的基础操作III 时间限制:1.000S 空间限制:128MB 题目描述 请编写一个程序,实现以下链表操作:构建一个单向链表,链表中包含一组整数数据。 1. 实现在链表的第 n 个位置插入一个元素,输出整个链表的…

0-1背包问题详解

0-1背包问题 部分一:问题描述 0-1背包问题是一类经典的组合优化问题,它出现在很多实际生活和工业环境中。问题描述如下: 假设你是一个冒险家,带着一个可承重的背包,面对一堆宝物。每件宝物都有自己的价值&#xff0…

【设计模式-2.1】创建型——单例模式

说明:设计模式根据用途分为创建型、结构性和行为型。创建型模式主要用于描述如何创建对象,本文介绍创建型中的单例模式。 饿汉式单例 单例模式是比较常见的一种设计模式,旨在确保对象的唯一性,什么时候去使用这个对象都是同一个…

Rust UI开发(一):使用iced构建UI时,如何在界面显示中文字符

注:此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库,用于为rust语言程序构建UI界面。 iced的基本逻辑是: UI交互产生消息message,message传递给后台的update,在这个函数中编写逻辑,然后通过…

Pytest做性能测试?

Pytest其实也是可以做性能测试或者基准测试的。是非常方便的。 可以考虑使用Pytest-benchmark类库进行。 安装pytest-benchmark 首先,确保已经安装了pytest和pytest-benchmark插件。可以使用以下命令安装插件: pip install pytest pytest-benchmark …

黑马一站制造数仓实战1

1. 项目目标 一站制造 企业中项目开发的落地:代码开发 代码开发:SQL【DSL SQL】 SparkCore SparkSQL 数仓的一些实际应用:分层体系、建模实现 2. 内容目标 项目业务介绍:背景、需求 项目技术架构:选型、架构 项目环境…

ubuntu系统下搭建本地物联网mqtt服务器的步骤

那么假如我们需要做一些终端设备,例如温湿度传感器、光照等物联网采集设备要接入呢?怎么样才能将数据报送到服务器呢? 以下内容基于我们ubuntu系统下的emqx成功启动的基础上。我们可以用浏览器键入控制板的地址,如果启动成功&…

数据爬取+可视化实战_告白气球_词云展示----酷狗音乐

一、前言 歌词上做文本分析,数据存储在网页上,需要爬取数据下来,词云展示在工作中也变得日益重要,接下来将数据爬虫与可视化结合起来,做个词云展示案例。 二、代码 # -*- coding:utf-8 -*- # 酷狗音乐 通过获取每首歌…

HarmonyOS到底有哪些独特之处?你真正了解鸿蒙多少!

鸿蒙系统太炸裂了💥我已经后悔了😭后悔没早点学习鸿蒙 HarmonyOS 概念,系统定位 1:鸿蒙系统是由华为公司自主研发的全球化开放源代码操作系统,它具有以下特别之处: 2:分布式架构:…

SpringBoot+mysql+vue实现大学生健康档案管理系统前后端分离

一、项目简介 本项目是一套基于SpringBoot实现大学生健康档案管理系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试&#…