引言
在刚开始承接需求的时候,大多数的开发者都采用了一种平铺式的开发思路,从头到尾,一个方法就将需求实现啦,简单又快捷。殊不知后续的维护成为了头疼的事情,真是开发一时爽,后续维护火葬场。新增需求就成为打补丁的工作,慢慢的就成了人们说的s山代码。
作为有追求的开发者来说,提高自身面向对象编程的能力成为了补强的一个点。其中设计模式对于改造代码结构起着非常重要的作用,并且主流框架里面也很多地方采用了设计模式的地方,因此熟悉设计模式,对于自己的需求实现还是理解其他项目也起着非常重要的作用。
今天来记录一下另一个简单的设计模式-外观模式(Facade Pattern)
外观模式
外观模式属于创建型模式的一种。它提供了一个统一的接口,用来访问子系统中的一群接口,其目的是减少系统的复杂性,并提高代码的可读性和可维护性。假设有一个复杂的音频播放系统,包括音频播放器、音量控制器和均衡器三个子系统,对Client提供了一个外观类(MusicSystemFacade),其UML图如下:
外观模式包含如下角色:
• 子系统类:这些是实现系统核心功能的类。它们可以相互协作完成一系列复杂的功能。
• 外观类:它充当客户端和子系统之间的桥梁。
• 客户端:使用外观类的对象,通过外观类提供的接口来访问子系统的功能,而无需直接与子系统中的类交互。
代码实例如下:
// 定义很多个子系统
// 假设我们有一个复杂的音频播放系统,包括音频播放器、音量控制器和均衡器三个子系统。
interface Player {
void play();
}
interface VolumeControl {
void setVolume(int level);
}
interface Equalizer {
void setEqualizer(String setting);
}
class AudioPlayer implements Player {
@Override
public void play() {
System.out.println("AudioPlayer: Playing music");
}
}
// 子系统的实现
class VolumeController implements VolumeControl {
@Override
public void setVolume(int level) {
System.out.println("VolumeController: Setting volume to " + level);
}
}
class EqualizerImpl implements Equalizer {
@Override
public void setEqualizer(String setting) {
System.out.println("Equalizer: Setting equalizer to " + setting);
}
}
// 外观类,有多个子系统组成
class MusicSystemFacade {
private final AudioPlayer player;
private final VolumeController volumeCtrl;
private final Equalizer eq;
public MusicSystemFacade() {
player = new AudioPlayer();
volumeCtrl = new VolumeController();
eq = new EqualizerImpl();
}
public void startMusic(int volume, String equalizerSetting){
volumeCtrl.setVolume(volume);
eq.setEqualizer(equalizerSetting);
player.play();
}
}
/**
* @堆代码 duidaima.com
* @date 2024/7/7 9:26
* Client 类
*/
public class Main {
public static void main(String[] args) {
MusicSystemFacade facade = new MusicSystemFacade();
facade.startMusic(5, "Rock");
}
}
代码解析
• 子系统接口定义:
• Player 接口定义了一个play方法,用于播放音乐。
• VolumeControl 接口定义了一个setVolume方法,用于设置音量。
• Equalizer 接口定义了一个setEqualizer方法,用于设置均衡器的效果。
• 子系统实现:
• AudioPlayer 类实现了Player接口,提供了播放音乐的功能。
• VolumeController 类实现了VolumeControl接口,提供了设置音量的功能。
• EqualizerImpl 类实现了Equalizer接口,提供了设置均衡器效果的功能。
• 外观类实现:
• MusicSystemFacade 类是外观类,它包含了对所有子系统类的引用(player、volumeCtrl 和 eq)。在构造函数中,实例化了这些子系统类。
• startMusic 方法是MusicSystemFacade提供的简化接口,接受音量级别和均衡器设置作为参数,然后调用子系统的方法来设置音量、均衡器并开始播放音乐。
• 主函数(Client): 在main方法中,创建了MusicSystemFacade的实例,并调用了startMusic方法,传递音量为5和均衡器设置为"Rock"。
小结
客户端只需要与MusicSystemFacade交互,而不需要关心内部子系统是如何具体实现的。这样不仅减少了客户端代码的复杂性,也提高了子系统与客户端的解耦,使得系统更加灵活和易于维护。