外观模式(面子模式)

外观模式

文章目录

什么是外观模式

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

相关推荐
智能体与具身智能2 小时前
TVA具身智能的概念、架构与应用(19)
人工智能·python·具身智能
小灰灰搞电子3 小时前
Rust+Slint 实现动态消息提示框源码分享
开发语言·后端·rust
2601_962294613 小时前
python中range函数怎么用
python·for循环·可迭代对象·range函数·整数列表
传奇开心果编程4 小时前
【Rust入门知识点学与练】第21课:Trait 进阶 Advanced Traits
开发语言·学习·rust
青 春 记 忆4 小时前
零基础入门python70:Docker Compose 编排完整后端
python·后端开发
新时代牛马4 小时前
字符设备驱动完整篇:从 cdev_add、file_operations 到chrdev_open 与排障
开发语言·python
swordbob4 小时前
ReentrantLock 与 AQS 完整学习手册
java·开发语言
白山编程大哥5 小时前
Java OutputStreamWriter 详解:从字符到字节的桥梁
java·开发语言·python
落羽的落羽6 小时前
【AI】快速理解AI应用的相关名词概念
linux·c++·人工智能·python·计算机网络·算法
Chasing__Dreams6 小时前
大模型应用开发--13--RAG 查询优化策略
python