当前位置: 首页 > news >正文

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

文章目录

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

一、结构型设计模式

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

结构型设计模式包括:适配器模式(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.lryc.cn/news/251026.html

相关文章:

  • Android 中的权限
  • 【java智慧工地源码】智慧工地物联网云平台,实现现场各类工况数据采集、存储、分析与应用
  • oracle 19c rac 安装手册
  • sqlMap
  • 蓝桥杯每日一题2023.12.2
  • 【计算机网络学习之路】序列化,反序列化和初识协议
  • 亚马逊云科技推出新一代自研芯片
  • VIT总结
  • C++11——initializer_list
  • 数学字体 Mathematical fonts
  • Python简单模拟蓝牙车钥匙协议
  • 【Python3】【力扣题】383. 赎金信
  • 外包搞了6年,技术退步明显......
  • uni-app x生成的安卓包,安装时,提示不兼容。解决方案
  • Screenshot To Code
  • SpringBoot 是如何启动一个内置的Tomcat
  • 《功能磁共振多变量模式分析中空间分辨率对解码精度的影响》论文阅读
  • pygame实现贪吃蛇小游戏
  • 反序列化漏洞(二)
  • 【开箱即用】前后端同时开源!周末和AI用Go语言共同研发了一款笔记留言小程序!
  • java对xml压缩
  • GoLang切片
  • 前端入门(四)Ajax、Promise异步、Axios通信、vue-router路由、组件库
  • 正则表达式回溯陷阱
  • MATLAB实战 | S函数的设计与应用
  • Day41 使用listwidget制作简易图片播放器
  • matlab 基于卡尔曼滤波的GPS-INS的数据融合的导航
  • vivado实现分析与收敛技巧6-策略建议
  • SOCKET、TCP、HTTP之间的区别与联系
  • javascript的Proxy