外观模式

本文介绍外观模式如何通过提供统一接口来简化子系统的使用。通过Java示例代码展示了如何使用外观模式来控制多个子系统,如屏幕、音响和DVD播放器,从而实现更便捷的操作流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

外观模式提供了一个统一的接口,用来方位子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

类图

这里写图片描述

java代码

// 屏幕
public class Screen {

    public void down() {
        System.out.println("screen down ...");
    }

    public void up() {
        System.out.println("screen up ...");
    }
}

// 音响
public class Stereo {

    public void on() {
        System.out.println("stereo on ...");
    }

    public void off() {
        System.out.println("stereo off ...");
    }

    public void setVolume(int volume) {
        System.out.println("stereo volume set " + volume);
    }
}

// dvd播放机
public class DVDPlayer {
    private String name;

    public void on() {
        System.out.println("dvd player on ...");
    }

    public void off() {
        System.out.println("dvd player off ...");
    }

    public void insertDVD(String name) {
        this.name = name;
        System.out.println("DVD " + name + " insert ...");
    }

    public void takeDVD() {
        this.name = "";
        System.out.println("DVD " + name + " take ...");
    }
}

// 外观对象
public class EasyUse {

    private Screen screen;
    private Stereo stereo;
    private DVDPlayer dvdPlayer;

    public EasyUse(Screen screen, Stereo stereo, DVDPlayer dvdPlayer) {
        this.screen = screen;
        this.stereo = stereo;
        this.dvdPlayer = dvdPlayer;
    }

    public void on() {
        screen.down();
        stereo.on();
        stereo.setVolume(10);
        dvdPlayer.on();
        dvdPlayer.insertDVD("XXX DVD");
    }

    public void off() {
        dvdPlayer.takeDVD();
        dvdPlayer.off();
        stereo.setVolume(0);
        stereo.off();
        screen.up();
    }
}

// 测试对象
public class Test {

    public static void main(String[] args) {
        new Test().test();
    }

    private void test() {

        // 创建电器对象
        Screen screen = new Screen();
        Stereo stereo = new Stereo();
        DVDPlayer dvdPlayer = new DVDPlayer();

        EasyUse easyUse = new EasyUse(screen, stereo, dvdPlayer);
        easyUse.on();
        easyUse.off();
    }
}

注:

现在我们可以很方便的看一场电影,不需要再打开和设置各种电器
提供简化接口的同时,依然将系统完整的功能暴露出来,以供需要的人使用
将客户从组件的子系统中解耦
外观模式需要区别于适配器模式(可参考我的另一篇文章),两者目的不同
外观模式:提供子系统的一个简化接口
适配器模式:伪装接口符合客户的期望

参考文章
1. Head First 设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值