gpt4 book ai didi

java - 了解适配器设计模式的实用性

转载 作者:行者123 更新时间:2023-11-30 09:00:26 25 4
gpt4 key购买 nike

嗯,我正在研究适配器设计模式,但我对我在书中看到的一个例子感到困惑。场景如下:

我有一个实现 MediaPlayer 接口(interface)的 AudioPlayer 类,它只能播放 MP3 音乐。见:

public interface MediaPlayer {
public void play(String audioType, String fileName);
}


public class AudioPlayer implements MediaPlayer {

@Override
public void play(String audioType, String fileName) {
if (audioType.equalsIgnoreCase("mp3")){
System.out.println("Playing "+fileName+" ...");
}else{
System.err.println("Unsupported Format");
}
}

}

现在,我有了另外一个功能更多的第三个库,比如播放 MP4 和 VCL 格式。这是接口(interface)和类(假设我无法更改第三个库中的任何内容,只是 .class 文件):

public interface AdvancedMediaPlayer {  
public void playVlc(String fileName);
public void playMp4(String fileName);
}

public class VlcPlayer implements AdvancedMediaPlayer{
@Override
public void playVlc(String fileName) {
System.out.println("Playing vlc file. Name: "+ fileName);
}

@Override
public void playMp4(String fileName) {
//do nothing
}
}

public class Mp4Player implements AdvancedMediaPlayer{

@Override
public void playVlc(String fileName) {
//do nothing
}

@Override
public void playMp4(String fileName) {
System.out.println("Playing mp4 file. Name: "+ fileName);
}
}

因此,这本书建议我应该创建一个实现 MediaPlayer 并使用 AdvancedMediaPlayer 的 MediaAdapter 类,如下所示:

public class MediaAdapter implements MediaPlayer {

AdvancedMediaPlayer advancedMusicPlayer;

public MediaAdapter(String audioType){
if(audioType.equalsIgnoreCase("vlc") ){
advancedMusicPlayer = new VlcPlayer();
} else if (audioType.equalsIgnoreCase("mp4")){
advancedMusicPlayer = new Mp4Player();
}
}

@Override
public void play(String audioType, String fileName) {
if(audioType.equalsIgnoreCase("vlc")){
advancedMusicPlayer.playVlc(fileName);
}else if(audioType.equalsIgnoreCase("mp4")){
advancedMusicPlayer.playMp4(fileName);
}
}
}

然后我将在 AudioPlayer 类中使用这个 MediaApter 来添加对其他格式的支持,如下所示:

public class AudioPlayer implements MediaPlayer {
MediaAdapter mediaAdapter;

@Override
public void play(String audioType, String fileName) {

//inbuilt support to play mp3 music files
if(audioType.equalsIgnoreCase("mp3")){
System.out.println("Playing mp3 file. Name: "+ fileName);
}
//mediaAdapter is providing support to play other file formats
else if(audioType.equalsIgnoreCase("vlc")
|| audioType.equalsIgnoreCase("mp4")){
mediaAdapter = new MediaAdapter(audioType);
mediaAdapter.play(audioType, fileName);
}
else{
System.out.println("Invalid media. "+
audioType + " format not supported");
}
}
}

但我真的不明白为什么要做这么简单的事情。我的建议是删除 MediaAdapter 类并使用 AudioPlayer 类进行此操作:

public class AudioPlayer implements MediaPlayer {


@Override
public void play(String audioType, String fileName) {

//inbuilt support to play mp3 music files
if(audioType.equalsIgnoreCase("mp3")){
System.out.println("Playing mp3 file. Name: "+ fileName);
}
//mediaAdapter is providing support to play other file formats
else if(audioType.equalsIgnoreCase("vlc")){
new VclPlayer().playVlc(fileName);
}else if (audioType.equalsIgnoreCase("mp4")){
new Mp4Player().playMp4(fileName);
}
else{
System.out.println("Invalid media. "+
audioType + " format not supported");
}
}
}

因此,我需要理解为什么在我可以放弃此选项并直接在 AudioPlayer 类中使用 VclPlayer 或 Mp4Player 时使用 MediaAdapter。

最佳答案

您应该尽可能地解耦。AudioPlayer 不应该知道 VclPlayerMp4Player 的实现。

AudioPlayer 应该只关心播放文件(调用适配器的 play 方法)。

如何播放 AudioPlayer 应该不是什么问题。

假设 Mp4Player 已更改,现在接受一个新的构造函数参数。 AudioPlayer 很可能不知道如何提供此参数。这就是 MediaAdapter 存在的原因,这是应该担心配置播放器的类。

您现在看到了,您为每个类(class)赋予了特定的目的。

  • VlcPlayerMp4Player 知道如何播放特定文件。
  • MediaAdapter 知道如何初始化和配置这些播放器,以及在给定要播放的文件时调用哪个播放器
  • AudioPlayer 将成为用户和 MediaAdapter 之间的桥梁。它将获取文件并将其提供给适配器。

关于java - 了解适配器设计模式的实用性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26803236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com