外观模式(面子模式)

外观模式

文章目录

什么是外观模式

外观模式(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 子系统提供了简洁的接口,使得客户端无需直接与子系统交互,简化了系统的使用。

相关推荐
羊小猪~~1 分钟前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
晨曦_子画7 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
Black_Friend15 分钟前
关于在VS中使用Qt不同版本报错的问题
开发语言·qt
放飞自我的Coder31 分钟前
【python ROUGE BLEU jiaba.cut NLP常用的指标计算】
python·自然语言处理·bleu·rouge·jieba分词
希言JY39 分钟前
C字符串 | 字符串处理函数 | 使用 | 原理 | 实现
c语言·开发语言
残月只会敲键盘39 分钟前
php代码审计--常见函数整理
开发语言·php
xianwu54339 分钟前
反向代理模块
linux·开发语言·网络·git
ktkiko111 小时前
Java中的远程方法调用——RPC详解
java·开发语言·rpc
正义的彬彬侠1 小时前
【scikit-learn 1.2版本后】sklearn.datasets中load_boston报错 使用 fetch_openml 函数来加载波士顿房价
python·机器学习·sklearn
张小生1801 小时前
PyCharm中 argparse 库 的使用方法
python·pycharm