外观模式(面子模式)

外观模式

文章目录

什么是外观模式

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

相关推荐
哥不想学算法6 小时前
【C++】字符串字面量拼接
开发语言·c++
hhzz7 小时前
Python大数据实战(十六):音乐推荐系统——基于协同过滤算法构建个性化歌单引擎
大数据·人工智能·python·数据挖掘·数据分析
SunnyDays10117 小时前
Python PDF 转 Markdown 详解(转换整个文档,特定页面,表格,扫描 PDF)
python·pdf 转 markdown·pdf 转 md·扫描 pdf 转 md·pdf 表格转 md
gugucoding7 小时前
21. 【C语言】打包不同类型:结构体
c语言·开发语言
2601_954706497 小时前
云手机 API 自动化实战:Python 批量控机、挂机脚本完整实现
python·智能手机·自动化
Brookty8 小时前
【JavaEE】线程安全(一).4:写块串行保安全、CAS
java·开发语言·java-ee·多线程·线程安全
F20226974868 小时前
西门子 PLC 与 C# 通信
开发语言·c#
gugucoding9 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
万联WANFLOW9 小时前
多分支企业组网,IP 网段到底该怎么规划
开发语言·php