前言
在软件开发的世界里,设计模式如同一本精妙的编码诗集,已经成为一种标准的编程实践。在Java编程中,设计模式很重要。是软件开发中广泛应用的一种编程方法,它可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本人将制作一个关于Java设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源:Gitee点击跳转。在上一篇《Java设计模式(7)装饰器模式》文章中,我们介绍了装饰器模式。本文是这个系列的第八篇章,我们将讲解一下外观模式的实现方式、应用场景以及它的用途。
外观模式
外观模式是一种结构型设计模式,提供一个统一的接口,用于访问子系统中的一组接口。隐藏了子系统的复杂性,为客户端提供了一个简单的接口,使得客户端不需要了解子系统的具体实现细节,降低系统的耦合性,并使得系统更易于维护和扩展。
使用场景
- 当存在一个复杂的子系统,并且希望为客户端提供一个简单的接口来访问该子系统时,可以使用外观模式。
- 当需要将子系统的接口进行封装,以隔离客户端与子系统之间的依赖关系时,也可以使用外观模式。
- 当需要简化一个复杂接口的使用,提供一个更加友好的接口给客户端时,外观模式同样适用。
代码实现
这里采用多媒体播放器来举个例子。首先是有一个媒体接口 Media
代码语言:javascript复制/**
* 媒体接口
* @author Jensen
* @date 2024-01-31
* */
public interface Media {
void play();
}
随后创建 AudioPlayer 和 VideoPlayer 并实现于Media,表示这是两种不同媒体的具体操作:
代码语言:javascript复制/**
* 音频类
* @author Jensen
* @date 2024-01-31
* */
public class AudioPlayer implements Media {
@Override
public void play() {
System.out.println("播放音频");
}
}
代码语言:javascript复制/**
* 视频类
* @author Jensen
* @date 2024-01-31
* */
public class VideoPlayer implements Media {
@Override
public void play() {
System.out.println("播放视频");
}
}
随后再创建一个 MultimediaPlayerFacade 多媒体外观类,将 AudioPlayer 和 VideoPlayer 的初始化过程封装到一个简单的接口中
代码语言:javascript复制import com.nn.facade.impl.AudioPlayer;
import com.nn.facade.impl.VideoPlayer;
public class MultimediaPlayerFacade {
private final Media audioPlayer;
private final Media videoPlayer;
public MultimediaPlayerFacade() {
audioPlayer = new AudioPlayer();
videoPlayer = new VideoPlayer();
}
// 提供简化接口给客户端
public void playAudio() {
audioPlayer.play();
}
public void playVideo() {
videoPlayer.play();
}
}
这样在使用当中只要在 MultimediaPlayerFacade 里直接拿接口数据就可以了,无需知道底层是怎样实现的
测试使用
代码语言:javascript复制System.out.println("------------------------------外观模式-----------------------------");
MultimediaPlayerFacade multimediaPlayerFacade = new MultimediaPlayerFacade();
multimediaPlayerFacade.playAudio();
multimediaPlayerFacade.playVideo();
结语
Spring中的很多组件都使用了外观模式来隐藏底层的复杂性。例如,Spring中的AOP提供了一个简单的接口,封装了底层的动态代理、拦截器等。还有Spring中的JDBC模块也提供了一个简单的接口,封装了与数据库操作相关的底层细节。
Java网络编程中的Socket类和ServerSocket类也是外观模式的应用,也是提供了一个简单的接口,封装了与网络通信相关的底层细节。