外观模式(面子模式)

外观模式

文章目录

什么是外观模式

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

相关推荐
Hylan_J1 小时前
【VSCode】MicroPython环境配置
ide·vscode·python·编辑器
软件黑马王子1 小时前
C#初级教程(4)——流程控制:从基础到实践
开发语言·c#
莫忘初心丶1 小时前
在 Ubuntu 22 上使用 Gunicorn 启动 Flask 应用程序
python·ubuntu·flask·gunicorn
闲猫1 小时前
go orm GORM
开发语言·后端·golang
李白同学3 小时前
【C语言】结构体内存对齐问题
c语言·开发语言
黑子哥呢?4 小时前
安装Bash completion解决tab不能补全问题
开发语言·bash
失败尽常态5234 小时前
用Python实现Excel数据同步到飞书文档
python·excel·飞书
2501_904447744 小时前
OPPO发布新型折叠屏手机 起售价8999
python·智能手机·django·virtualenv·pygame
青龙小码农4 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿4 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法