首页 > 其他分享 >结构型——适配器模式

结构型——适配器模式

时间:2023-05-27 16:44:08浏览次数:47  
标签:string 适配器 接口 fileName 模式 audioType public 结构型

推荐文档:

https://www.cnblogs.com/zhili/p/DesignPatternSummery.html

https://www.runoob.com/design-pattern/design-pattern-tutorial.html

什么是适配器模式?

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。

举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。

相关介绍

意图:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

主要解决:主要解决在软件系统中,常常要将一些"现存的对象"放到新的环境中,而新环境要求的接口是现对象不能满足的。

何时使用: 1、系统需要使用现有的类,而此类的接口不符合系统的需要。 2、想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作,这些源类不一定有一致的接口。 3、通过接口转换,将一个类插入另一个类系中。(比如老虎和飞禽,现在多了一个飞虎,在不增加实体的需求下,增加一个适配器,在里面包容一个虎对象,实现飞的接口。)

如何解决:继承或依赖(推荐)。

关键代码:适配器继承或依赖已有的对象,实现想要的目标接口。

应用实例: 1、美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V。 2、JAVA JDK 1.1 提供了 Enumeration 接口,而在 1.2 中提供了 Iterator 接口,想要使用 1.2 的 JDK,则要将以前系统的 Enumeration 接口转化为 Iterator 接口,这时就需要适配器模式。 3、在 LINUX 上运行 WINDOWS 程序。 4、JAVA 中的 jdbc。

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

缺点: 1、过多地使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是 A 接口,其实内部被适配成了 B 接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。因此如果不是很有必要,可以不使用适配器,而是直接对系统进行重构。 2.由于 JAVA 至多继承一个类,所以至多只能适配一个适配者类,而且目标类必须是抽象类。

使用场景:有动机地修改一个正常运行的系统的接口,这时应该考虑使用适配器模式。

注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。

相关实现

我们有一个 MediaPlayer 接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer。默认情况下,AudioPlayer 可以播放 mp3 格式的音频文件。

我们还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。该类可以播放 vlc 和 mp4 格式的文件。

我们想要让 AudioPlayer 播放其他格式的音频文件。为了实现这个功能,我们需要创建一个实现了 MediaPlayer 接口的适配器类 MediaAdapter,并使用 AdvancedMediaPlayer 对象来播放所需的格式。

AudioPlayer 使用适配器类 MediaAdapter 传递所需的音频类型,不需要知道能播放所需格式音频的实际类。AdapterPatternDemo 类使用 AudioPlayer 类来播放各种格式。

 

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Threading.Tasks;
  6 
  7 namespace Biao.DesignPatterns.StructuralPatterns
  8 {
  9     /// <summary>
 10     /// 创建2个 为媒体播放器和更高级的媒体播放器 的接口
 11     /// </summary>
 12     public interface MediaPlayer
 13     {
 14         public void Play(string audioType, string fileName);
 15     }
 16 
 17     public interface AdvancedMediaPlayer
 18     {
 19         public void PlayVlc(string fileName);
 20         public void PlayMp4(string fileName);
 21     }
 22 
 23     /// <summary>
 24     /// 创建2个实现了AdvancedMediaPlayer接口的实体类
 25     /// </summary>
 26     public class VlcPlayer : AdvancedMediaPlayer
 27     {
 28         public void PlayVlc(string fileName)
 29         {
 30             Console.WriteLine("Playing vlc file. Name:" + fileName);
 31         }
 32 
 33         public void PlayMp4(string fileName)
 34         {
 35             // 什么也不做
 36         }
 37     }
 38 
 39     public class MP4Player : AdvancedMediaPlayer
 40     {
 41         public void PlayMp4(string fileName)
 42         {
 43             Console.WriteLine("Playing mp4 file. Name:" + fileName);
 44         }
 45 
 46         public void PlayVlc(string fileName)
 47         {
 48             // 什么也不做
 49         }
 50     }
 51 
 52     /// <summary>
 53     /// 创建实现了MediaPlayer接口的适配器类
 54     /// </summary>
 55     public class MediaAdapter : MediaPlayer
 56     {
 57         AdvancedMediaPlayer advancedMediaPlayer;
 58 
 59         public MediaAdapter(string audioType)
 60         {
 61             if (audioType.Equals("vlc"))
 62             {
 63                 advancedMediaPlayer = new VlcPlayer();
 64             }
 65             else if (audioType.Equals("mp4"))
 66             {
 67                 advancedMediaPlayer = new MP4Player();
 68             }
 69         }
 70 
 71         public void Play(string audioType, string fileName)
 72         {
 73             if (audioType.Equals("vlc"))
 74             {
 75                 advancedMediaPlayer.PlayVlc(fileName);
 76             }
 77             else if (audioType.Equals("mp4"))
 78             {
 79                 advancedMediaPlayer.PlayMp4(fileName);
 80             }
 81         }
 82     }
 83 
 84     public class AudioPlayer : MediaPlayer
 85     {
 86         MediaAdapter mediaAdapter;
 87 
 88         public void Play(string audioType, string fileName)
 89         {
 90             if (audioType.Equals("mp3"))
 91             {
 92                 Console.WriteLine("Playing mp3 file. Name:" + fileName);
 93             }
 94             else if (audioType.Equals("vlc") || audioType.Equals("mp4"))
 95             {
 96                 mediaAdapter = new MediaAdapter(audioType);
 97                 mediaAdapter.Play(audioType, fileName);
 98             }
 99             else
100             {
101                 Console.WriteLine($"Invalid media. {audioType} format not supported");
102             }
103         }
104     }
105 }
106  
107 
108 static void TestAdapterPattern()
109 {
110     Console.WriteLine("---------------测试适配器模式---------------");
111     AudioPlayer audioPlayer = new AudioPlayer();
112     audioPlayer.Play("mp3", "只因你太美.mp3");
113     audioPlayer.Play("mp4", "铁山靠.mp4");
114     audioPlayer.Play("vlc", "泥食不食油饼.vlc");
115     audioPlayer.Play("avi", "荔枝.avi");
116 }

 



标签:string,适配器,接口,fileName,模式,audioType,public,结构型
From: https://www.cnblogs.com/swbna/p/17436959.html

相关文章

  • 设计模式概述
    推荐文档:https://www.cnblogs.com/zhili/p/DesignPatternSummery.htmlhttps://www.runoob.com/design-pattern/design-pattern-tutorial.html为什么要使用设计模式?使用设计模式的根本原因是适应变化,为了增加代码复用率,是软件更具有维护性和可扩展性。设计原则单一职责原则......
  • 创建型——单例模式
    推荐文档:https://www.cnblogs.com/zhili/p/DesignPatternSummery.htmlhttps://www.runoob.com/design-pattern/design-pattern-tutorial.html什么是单例模式?单例模式(SingletonPattern)是最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方......
  • 设计模式之备忘录(Memento)
    概述备忘录模式(MementoPattern),是行为型模式设计模式之一,该模式用于保存对象当前状态,并且在之后可以再次恢复到此状态。备忘录模式实现的方式需要保证被保存的对象状态不能被对象从外部访问,目的是为了保护被保存的这些对象状态的完整性以及内部实现不向外暴露,本篇博客,我们就来......
  • 网安--vmware三种网络模式
    三、vmare三种网络模式三种模式:桥接模式、NAT模式、仅主机模式三种设备:网卡、路由器(充当网关宽展接口划分vlan)、交换机(局域网中的机器接入到一个网络中)vmnet0(桥接模式)、vmnet1(仅主机模式)、vmnet8(NAT模式)让相同网络模式的主机相互连接虚拟网卡:让主机与虚拟机连接起来1、主机......
  • 单例模式
    1、创建一个类将无参构造器变成私有权限(有两种实现方式)点击查看代码packagecom.bh.test;publicclassPerson{//(2)//privatestaticPersonperson;//将person变量定义成静态变量,因为getInstance()为静态方法只能调用静态变量privatestaticPersonp......
  • 行业报告 | AIGC应用与实践展望报告:人工智能重塑内容产业的作业模式
    原创|BFT机器人前言Introduction不可否认AIGC的出现似乎已经让大家预见了Al应用的拐点,其创造性与智能性一夜之间刷新了大众认知。但去伪存真,在市场火爆的背后其真正的应用及商业价值几何,更待我们冷静地剖析。01概念重生:AIGC是内容生成方式一次进化缘起于GC,而归于AI,AIGC的关键是A......
  • 设计模式-观察者模式(Observer)
    一、 观察者(Observer)模式观察者模式又叫做发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通......
  • 混合模式开发之原生App webview与H5交互
    快速实现 混合模式开发之原生Appwebview与H5交互,详情请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12550 效果图如下:  代码如下: #原生appwebview与H5交互实现####HTML代码部分```html<template><viewclass="content"><viewclass="text......
  • 设计模式-行为型设计模式
    责任链模式定义为请求创建一个接收此次请求的链适用场景一个请求的处理需要多个对象当中的一个或几个协作处理优点请求的发送者和接收者(请求的处理)解耦责任链可以动态组合缺点责任链太长或者处理时间过长,影响性能责任链有可能过多/**处理者--或者Approver*@author......
  • Simple Factory Pattern 简单工厂模式简介与 C# 示例【创建型】【设计模式来了】
     〇、简介1、什么是简单工厂模式?一句话解释:  客户类和工厂类严格分工,客户类只需知道怎么用,处理逻辑交给工厂类。简单工厂模式(SimpleFactoryPattern)是日常开发中常用的设计模式。其是一种简单的创建型模式,它通过一个工厂类来创建对象,客户端只需要知道如何使用工厂类,而不需......