惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
博客园 - 叶小钗
GbyAI
GbyAI
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Stack Overflow Blog
Stack Overflow Blog
Jina AI
Jina AI
Microsoft Security Blog
Microsoft Security Blog
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 聂微东
Google DeepMind News
Google DeepMind News
Martin Fowler
Martin Fowler
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog
N
Netflix TechBlog - Medium
B
Blog
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
V
V2EX
雷峰网
雷峰网
Apple Machine Learning Research
Apple Machine Learning Research
人人都是产品经理
人人都是产品经理

牛牛技术客栈

设计模式-备忘录模式 - OXOXTECH 牛牛技术客栈 设计模式-中介者模式 - OXOXTECH 牛牛技术客栈 Linux【Ubuntu】修改ssh默认端口 - OXOXTECH 牛牛技术客栈 设计模式-迭代器模式 - OXOXTECH 牛牛技术客栈 scheduled定时任务的三种基本实现方式 - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(三) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(二) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(一) - OXOXTECH 牛牛技术客栈 基于JavaFX的桌面端网络调试工具 - OXOXTECH 牛牛技术客栈 Golang Channel的原理介绍 - OXOXTECH 牛牛技术客栈 Go语言Map的原理分析 - OXOXTECH 牛牛技术客栈 Go语言错误处理(panic)的最佳实践 - OXOXTECH 牛牛技术客栈 设计模式-解释器模式 - OXOXTECH 牛牛技术客栈 Redis报错Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. go-webpbin库在Linux报错failed to encode image to WebP: exit status 1.......的问题 exe4j 打包加密的jar - OXOXTECH 牛牛技术客栈 Go生成图形验证码示例 - OXOXTECH 牛牛技术客栈 澳门一天游:一日尽享东方与西方的交融之美 - OXOXTECH 牛牛技术客栈 设计模式-命令模式 - OXOXTECH 牛牛技术客栈 别再自己瞎写工具类了,SpringBoot内置工具类应有尽有 - OXOXTECH 牛牛技术客栈 中山一日游 - OXOXTECH 牛牛技术客栈 设计模式-责任链模式 - OXOXTECH 牛牛技术客栈 起舞吧,齐舞吧 - OXOXTECH 牛牛技术客栈 设计模式-组合模式 - OXOXTECH 牛牛技术客栈 Go语言Web开发|GoFrame框架入门笔记 - OXOXTECH 牛牛技术客栈 Java打包exe教程 - OXOXTECH 牛牛技术客栈 设计模式-代理模式 - OXOXTECH 牛牛技术客栈 MySQL存储过程的优缺点有哪些? - OXOXTECH 牛牛技术客栈 前端渲染优化有哪些? - OXOXTECH 牛牛技术客栈 HTTP状态码及其含义 - OXOXTECH 牛牛技术客栈
设计模式-外观模式 - OXOXTECH 牛牛技术客栈
Jensen · 2024-03-29 · via 牛牛技术客栈

设计模式-外观模式

Jensen Java Java, 设计模式

前言

Java开发中,设计模式是常用的一种编码方式,合理使用设计模式可以帮助开发人员更快地编写出高效、可靠和可维护的代码。本期将撰写一个关于设计模式的系列文章,总共23种设计模式将以一篇一篇文章讲解,代码笔记已开源至:Gitee点击跳转。在上一篇《Java设计模式(7)装饰器模式》文章中,我们介绍了装饰器模式。本文是这个系列的第八篇章,我们将讲解一下外观模式的实现方式、应用场景以及它的用途。

外观模式

外观模式是一种结构型设计模式,提供一个统一的接口,用于访问子系统中的一组接口。隐藏了子系统的复杂性,为客户端提供了一个简单的接口,使得客户端不需要了解子系统的具体实现细节,降低系统的耦合性,并使得系统更易于维护和扩展。

使用场景

  1. 当存在一个复杂的子系统,并且希望为客户端提供一个简单的接口来访问该子系统时,可以使用外观模式。
  2. 当需要将子系统的接口进行封装,以隔离客户端与子系统之间的依赖关系时,也可以使用外观模式。
  3. 当需要简化一个复杂接口的使用,提供一个更加友好的接口给客户端时,外观模式同样适用。

代码实现

这里采用多媒体播放器来举个例子。首先是有一个媒体接口 Media

/**
 * 媒体接口
 * @author Jensen
 * @date 2024-01-31
 * */
public interface Media {
    void play();
}

随后创建 AudioPlayer 和 VideoPlayer 并实现于Media,表示这是两种不同媒体的具体操作:

/**
 * 音频类
 * @author Jensen
 * @date 2024-01-31
 * */
public class AudioPlayer implements Media {
    @Override
    public void play() {
        System.out.println("播放音频");
    }
}

/**
 * 视频类
 * @author Jensen
 * @date 2024-01-31
 * */
public class VideoPlayer implements Media {
    @Override
    public void play() {
        System.out.println("播放视频");
    }
}

随后再创建一个 MultimediaPlayerFacade 多媒体外观类,将 AudioPlayer 和 VideoPlayer 的初始化过程封装到一个简单的接口中

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  里直接拿接口数据就可以了,无需知道底层是怎样实现的

测试使用

System.out.println("------------------------------外观模式-----------------------------");
MultimediaPlayerFacade multimediaPlayerFacade = new MultimediaPlayerFacade();
multimediaPlayerFacade.playAudio();
multimediaPlayerFacade.playVideo();

image.png

结语

Spring中的很多组件都使用了外观模式来隐藏底层的复杂性。例如,Spring中的AOP提供了一个简单的接口,封装了底层的动态代理、拦截器等。还有Spring中的JDBC模块也提供了一个简单的接口,封装了与数据库操作相关的底层细节。

Java网络编程中的Socket类和ServerSocket类也是外观模式的应用,也是提供了一个简单的接口,封装了与网络通信相关的底层细节。