外观模式(面子模式)

外观模式

文章目录

什么是外观模式

外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

Facade 外观类

知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象

SubSystem Classes 子系统类集合

实现子系统的功能,处理Facade对象指派的任务。注意子类中没有Facade的任何信息,即没有对Facade对象的引用

示例

外观模式(Facade Pattern)是一种结构设计模式,它为子系统中的一组接口提供了一个统一的高层接口,简化了外部对子系统的访问。以下是一个使用 Java 实现外观模式的示例,以简化对音乐播放系统的操作为例:

1.定义音乐播放系统中的各个子系统组件接口:

java 复制代码
// 音乐播放器
public interface MediaPlayer {
    // 播放
    void play();
    // 停止
    void stop();
    // 暂停
    void pause();
}
java 复制代码
public interface CDPlayer {
    void playCD(String title);
    void stopCD();
    // 弹出
    void ejectCD();
}
java 复制代码
// 收音机
public interface Radio {
    // 频道
    void tuneFrequency(int frequency);
    void turnOn();
    void turnOff();
}

2.实现子系统组件:

java 复制代码
public class CDPlayerImpl implements CDPlayer {
    @Override
    public void playCD(String title) {
        System.out.println("Playing CD: " + title);
    }

    @Override
    public void stopCD() {
        System.out.println("Stopping CD playback.");
    }

    @Override
    public void ejectCD() {
        System.out.println("Ejecting CD.");
    }
}
java 复制代码
public class RadioImpl implements Radio {
    @Override
    public void tuneFrequency(int frequency) {
        System.out.println("Tuning radio to frequency: " + frequency);
    }

    @Override
    public void turnOn() {
        System.out.println("Turning on the radio.");
    }

    @Override
    public void turnOff() {
        System.out.println("Turning off the radio.");
    }
}

3.创建音乐播放系统的外观类(Facade),封装子系统组件的操作:

java 复制代码
public class MusicPlayerFacade {
    private CDPlayer cdPlayer;
    private Radio radio;

    public MusicPlayerFacade(CDPlayer cdPlayer, Radio radio) {
        this.cdPlayer = cdPlayer;
        this.radio = radio;
    }

    public void playCD(String title) {
        cdPlayer.playCD(title);
    }

    public void stopMusic() {
        cdPlayer.stopCD();
        radio.turnOff();
    }

    public void playRadio(int frequency) {
        radio.turnOn();
        radio.tuneFrequency(frequency);
    }
}

4.在客户端代码中,通过外观类 MusicPlayerFacade 简化对音乐播放系统的操作:

java 复制代码
public class MusicPlayerDemo {
    public static void main(String[] args) {
        CDPlayer cdPlayer = new CDPlayerImpl();
        Radio radio = new RadioImpl();
        MusicPlayerFacade musicPlayer = new MusicPlayerFacade(cdPlayer, radio);

        musicPlayer.playCD("My Favorite Album");
        musicPlayer.stopMusic();

        musicPlayer.playRadio(103.Ⅲ);
    }
}

运行 MusicPlayerDemo 类的 main 方法,输出结果应为:

复制代码
Playing CD: My Favorite Album
Stopping CD playback.
Turning off the radio.
Tuning radio to frequency: 103.Ⅲ

在这个示例中,MusicPlayerFacade 类作为外观角色,为 CDPlayer 和 Radio 子系统提供了简洁的接口,使得客户端无需直接与子系统交互,简化了系统的使用。

相关推荐
Overboom1 小时前
[C++] --- 常用设计模式
开发语言·c++·设计模式
Univin1 小时前
C++(10.4)
开发语言·数据结构·c++
KyollBM1 小时前
每日羊题 (质数筛 + 数学 | 构造 + 位运算)
开发语言·c++·算法
Paul_09203 小时前
golang面经——map模块和sync.Map模块
开发语言
F_D_Z3 小时前
数据集相关类代码回顾理解 | StratifiedShuffleSplit\transforms.ToTensor\Counter
python·torchvision·transforms
Univin3 小时前
C++(10.5)
开发语言·c++·算法
haogexiaole4 小时前
Java高并发常见架构、处理方式、api调优
java·开发语言·架构
张人玉4 小时前
C# 通讯关键类的API
开发语言·c#
froginwe114 小时前
R 数组:深入解析与高效使用
开发语言
tao3556674 小时前
【Python刷力扣hot100】283. Move Zeroes
开发语言·python·leetcode