设计模式-外观模式

这篇博客介绍了如何运用外观模式(Facade)来组织家庭影院系统,包括DVD播放器、投影仪、音响等设备的控制流程。通过创建一个统一的外观类,实现了对子系统操作的集中管理和简化,使得客户端调用更加清晰,同时也提高了子系统的可维护性和扩展性。代码示例展示了如何创建和使用外观类来实现从开启到关闭家庭影院的整个过程。

组建一个家庭影院:DVD播放器、投影仪、自动屏幕、环绕立体声、爆米花机

要求完成使用家庭影院的功能,用遥控器统筹各设备开关,过程为:
• 开爆米花机
• 放下屏幕
• 开投影仪
• 开音响
• 开DVD,选dvd
• 去拿爆米花
• 调暗灯光
• 播放
• 观影结束后,关闭各种设备


1.传统方案

在客户端中直接使用各个子系统(比如投影仪类、音响类等)中定义的方法完成整体流程,缺点如下:

  • 会造成调用过程混乱,没有清晰的过程
  • 不利于维护子系统的操作

2.外观模式

2.1 介绍
  • 外观模式(Facade),也叫“过程模式。它为子系统中的一组接口提供一个一致的界面
  • 该模式定义了一个高层接口,这个接口使得子系统更加容易使用
  • 通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节
2.2 原理

在这里插入图片描述

  • 外观类(Facade):为调用端提供统一的调用接口, 外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象
  • 调用者(Client):外观接口的调用者
  • 子系统的集合:功能的实际提供者
2.3 代码实现
// 不同子系统有不同的功能,所以方法有所区别,但是结构类似
// DVD播放器子系统
public class DVDPlayer {
    // 使用单例模式中的饿汉式
    private static DVDPlayer instance = new DVDPlayer();

    public static DVDPlayer getInstanc() {
        return instance;
    }

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

    public void play() {
        System.out.println(" dvd is playing ");
    }

    public void pause() {
        System.out.println(" dvd pause ..");
    }
}
// 投影仪子系统
public class Projector {
    // 使用单例模式中的饿汉式
    private static Projector instance = new Projector();

    public static Projector getInstance() {
        return instance;
    }

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

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

    public void focus() {
        System.out.println(" Projector is Projector  ");
    }
}
// 外观类(Facade)
public class HomeTheaterFacade {
    // 定义各个子系统对象
    private TheaterLight theaterLight;
    private Popcorn popcorn;
    private Stereo stereo;
    private Projector projector;
    private Screen screen;
    private DVDPlayer dVDPlayer;

    public HomeTheaterFacade() {
        this.theaterLight = TheaterLight.getInstance();
        this.popcorn = Popcorn.getInstance();
        this.stereo = Stereo.getInstance();
        this.projector = Projector.getInstance();
        this.screen = Screen.getInstance();
        this.dVDPlayer = DVDPlayer.getInstanc();
    }

    // 操作分成4步
    public void ready() {
        popcorn.on();
        popcorn.pop();
        screen.down();
        projector.on();
        stereo.on();
        dVDPlayer.on();
        theaterLight.dim();
    }

    public void play() {
        dVDPlayer.play();
    }

    public void pause() {
        dVDPlayer.pause();
    }

    public void end() {
        popcorn.off();
        theaterLight.bright();
        screen.up();
        projector.off();
        stereo.off();
        dVDPlayer.off();
    }
}
// 调用者(Client)
public class Client {
    public static void main(String[] args) {
        HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();
        homeTheaterFacade.ready();
        homeTheaterFacade.play();
        homeTheaterFacade.end();
    }
}

3.注意事项和细节

  • 对外屏蔽了子系统的细节,降低了客户端对子系统使用的复杂性
  • 让子系统内部的模块更易维护和扩展
  • 当系统需要进行分层设计时,可以考虑使用外观模式

参考

https://www.bilibili.com/video/BV1G4411c7N4?p=81-85

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值