侧边栏壁纸
  • 累计撰写 98 篇文章
  • 累计创建 20 个标签
  • 累计收到 3 条评论

设计模式--外观模式

林贤钦
2020-05-12 / 0 评论 / 9 点赞 / 693 阅读 / 0 字
温馨提示:
本文最后更新于 2020-05-12,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

外观模式(Facade Pattern)

1. 介绍

1.1 模式说明

外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节

定义了一个高层接口,这个接口使得这一子系统更加容易使用

1.2 主要作用

1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。

2、定义系统的入口。

客户端不与系统耦合,外观类与系统耦合。

2. 模式优缺点

优点

  • 减少了系统的相互依赖
  • 提高了灵活性。不管系统内部如何变化,只要不影响到外观对象,任你自由活动
  • 提高了安全性。想让你访问子系统的哪些业务就开通哪些逻辑,不在外观上开通的方法,你就访问不到

缺点

  • 不符合开不原则,修改很麻烦

3. 应用场景

  • 为一个复杂的模块或子系统提供一个外界访问的接口
  • 子系统相对独立,外界对子系统的访问只要黑箱操作即可
  • 预防低水平人员带来的风险扩散

4. 实例讲解

4.1 实例概况

影院管理项目

组建一个家庭影院

DVD 播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,其过程为: 直接用遥控器:统筹各设备开关

开爆米花机放 下 屏 幕 开 投 影 仪 开音响

开 DVD,选 dvd

去拿爆米花调 暗 灯 光 播放

观影结束后,关闭各种设备

传统方式解决影院管理问题分析

  1. 在 ClientTest 的 main 方法中,创建各个子系统的对象,并直接去调用子系统(对象)相关方法

    会造成调用过程混乱,没有清晰的过程

  2. 不利于在 ClientTest 中,去维护对子系统的操作

  3. 解决思路:

    定义一个高层接口,给子系统中的一组接口提供一个一致的界面(比如在高层接口提供四个方法

  4. 也就是说 就是通过定义一个一致的接口(界面类)

    用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节

外观模式解决

  • 外观模式可以理解为转换一群接口,客户只要调用一个接口,而不用调用多个接口才能达到目的。

比如:在 pc 上安装软件的时候经常有一键安装选项(省去选择安装目录、安装的组件等等)

还有就是手机的重启功能(把关机和启动合为一个操作)。

  1. 外观模式就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用

4.2实例uml类图

4.3代码实现

1、定义各个子系统对象

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 Popcorn {
    private static Popcorn instance = new Popcorn();


    public static Popcorn getInstance() { return instance;
    }


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

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


    public void pop() {
        System.out.println(" popcorn is poping ");
    }
}

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    ");
    }
}

public class Screen {
    private static Screen instance = new Screen();

    public static Screen getInstance() {
        return instance;
    }

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

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

public class Stereo {
    private static Stereo instance = new Stereo();


    public static Stereo getInstance() { return instance;
    }


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


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

}

public class TheaterLight {
    private static TheaterLight instance = new TheaterLight();


    public static TheaterLight getInstance() {
        return instance;
    }


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


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


    public void dim() {
        System.out.println(" TheaterLight dim.. ");
    }

    public void bright() {
        System.out.println(" TheaterLight bright.. ");
    }
}

2、统一接口

public class HomeTheaterFacade {
    //定义各个子系统对象
    private TheaterLight theaterLight;
    private Popcorn popcorn;
    private Stereo stereo;
    private Projector projector;
    private Screen screen;
    private DVDPlayer dVDPlayer;


    //构造器
    public HomeTheaterFacade() {
        super();
        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();
    }
}

3、客户端调用

public class Client {
    public static void main(String[] args) {
        HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();
        homeTheaterFacade.ready();
        homeTheaterFacade.play();
        homeTheaterFacade.end();
    }
}
9

评论区