结构型模式-6.外观模式(Facade Pattern)

 2024-07-29    0 条评论    25230 浏览

设计模式

外观模式(Facade Pattern)是一种结构型设计模式,它为复杂系统提供了一个简单统一的接口,隐藏了系统内部的复杂性,使得客户端只需通过外观对象即可访问系统的各个子系统。

让我们通过一个简单的 Java 代码示例来说明外观模式的用法。

假设我们有一个音频播放器的子系统,包括音频解码器、音频播放器和音频文件本身。我们将创建一个外观类 AudioPlayerFacade,它提供了一个简单的接口来播放音频文件,而不需要客户端直接与解码器和播放器交互。

首先,定义音频播放器接口及其实现类:

// 音频播放器接口
interface AudioPlayer {
    void load(String filename);
    void play();
    void stop();
}

// 具体音频播放器实现
class AudioPlayerImpl implements AudioPlayer {
    private String filename;

    @Override
    public void load(String filename) {
        System.out.println("Loading audio file: " + filename);
        this.filename = filename;
    }

    @Override
    public void play() {
        System.out.println("Playing audio file: " + filename);
    }

    @Override
    public void stop() {
        System.out.println("Stopping audio file: " + filename);
        this.filename = null;
    }
}

然后,创建音频播放器的解码器子系统:

// 音频解码器
class AudioDecoder {
    public void decode(String filename) {
        System.out.println("Decoding audio file: " + filename);
        // Simulate decoding process
    }
}

接下来,我们实现外观类 AudioPlayerFacade,它隐藏了解码和播放的复杂过程,为客户端提供了一个简单的接口:

// 外观类
class AudioPlayerFacade {
    private AudioPlayer player;
    private AudioDecoder decoder;

    public AudioPlayerFacade() {
        player = new AudioPlayerImpl();
        decoder = new AudioDecoder();
    }

    public void playAudio(String filename) {
        decoder.decode(filename); // 解码音频文件
        player.load(filename);    // 加载音频文件
        player.play();            // 播放音频文件
    }

    public void stopAudio() {
        player.stop(); // 停止音频播放
    }
}

最后,我们可以在客户端代码中使用外观模式来播放音频文件,而不必了解内部的解码和播放细节:

public class Client {
    public static void main(String[] args) {
        AudioPlayerFacade audioFacade = new AudioPlayerFacade();

        // 播放音频
        audioFacade.playAudio("song.mp3");

        // 停止音频
        audioFacade.stopAudio();
    }
}

在这个示例中,客户端通过 AudioPlayerFacade 来播放音频文件,而不需要直接与 AudioPlayerImplAudioDecoder 打交道。这样,外观模式有效地隐藏了系统内部的复杂性,提供了一个简单而统一的接口供客户端使用。