非官方解读外观模式

外观模式(Facade) : 外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度. 通过一个类持有所有其他类的引用,然后统一整合再调用的处理过程

作者是个二吊子,如果描述有误请指出.


使用场景

日常编码中,我们会遇到一个处理分成很多个步骤,而每个步骤是对不同的对象进行了操作.我们就会在代码中疯狂调用其他对象操作.这里称为子系统调用.如果我们这个处理在多个地方用到,是不是就很零散,不方便管理.并且如果后续其中一个子系统发生了变化,我其他的是不是要做相应的处理,比如新增了一个处理或者去除了一个处理.这就违反了开闭.也不满足复用.由此引出外观模式

外观模式

uml图
外观模式uml

子系统:DVDPlayer,Light,Popcorn,Projector,Screen,Stereo
外观类: HomeTheaterFacade
这里我们按照网上的例子.我们家庭影院的设备众多,如果我要看电影,那么我就需要打开dvd,打开灯光,打开爆米花机,打开投影,降下屏幕,打开立体声.然后才能够看电影.如果每个设备都提供一个单独的控制器,我们的操作就会非常繁琐.多看几次电影估计影院都不要了.由此我们用外观模式进行统一处理,将功能进行一个整合,对外只通过外观类进行操作,而外观类内部封装了相应子系统的各种调用逻辑.这样也提供了一个缓冲层,后续有修改我们可以修改一个地方即可.

/**
 * @Description: dvd
 * @Author: gaofan
 * @Date: 2020/3/23 15:39
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class DVDPlayer {

    public static DVDPlayer instance = new DVDPlayer();

    public static DVDPlayer getInstance() {
        return instance;
    }

    public void turnOn() {
        System.out.println("DVD打开了");
    }

    public void turnOff() {
        System.out.println("DVD关闭了");
    }

    public void play() {
        System.out.println("DVD开始播放了");
    }

    public void pause() {
        System.out.println("DVD暂停播放了");
    }
}
/**
 * @Description: 灯光
 * @Author: gaofan
 * @Date: 2020/3/23 15:45
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class Light {

    public static Light instance = new Light();

    public static Light getInstance() {
        return instance;
    }

    public void turnOn() {
        System.out.println("打开灯光");
    }

    public void turnOff() {
        System.out.println("关闭灯光");
    }
}
/**
 * @Description: 爆米花
 * @Author: gaofan
 * @Date: 2020/3/23 15:41
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class Popcorn {
    public static Popcorn instance = new Popcorn();

    public static Popcorn getInstance() {
        return instance;
    }

    public void turnOn() {
        System.out.println("开始制作爆米花");
    }

    public void turnOff() {
        System.out.println("爆米花机关闭了");
    }

    public void pop() {
        System.out.println("爆米花制作完成");
    }
}
/**
 * @Description: 投影仪
 * @Author: gaofan
 * @Date: 2020/3/23 15:42
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class Projector {

    public static Projector instance = new Projector();

    public static Projector getInstance() {
        return instance;
    }

    public void turnOn() {
        System.out.println("投影仪打开了");
    }

    public void turnOff() {
        System.out.println("投影仪关闭了");
    }

    public void focus() {
        System.out.println("投影仪聚焦了");
    }

}

/**
 * @Description: 屏幕
 * @Author: gaofan
 * @Date: 2020/3/23 15:43
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class Screen {

    public static Screen instance = new Screen();

    public static Screen getInstance() {
        return instance;
    }

    public void turnUp() {
        System.out.println("屏幕上升");
    }

    public void turnDown() {
        System.out.println("屏幕下降");
    }

}
/**
 * @Description: 立体声
 * @Author: gaofan
 * @Date: 2020/3/23 15:44
 * @Copyright: 2020 www.withu.top Inc. All rights reserved.
 **/
public class Stereo {

    public static Stereo instance = new Stereo();

    public static Stereo getInstance() {
        return instance;
    }

    public void turnOn() {
        System.out.println("打开立体声");
    }

    public void turnOff() {
        System.out.println("关闭立体声");
    }

}

类型: 外观模式
原理: 以外观类进行统一调用,让其中具体的调用逻辑透明,用户不需要关心内部具体的子系统调用过程,可以进行直接使用.后续如果需要修改或者新增可以非常方便.
瞎掰扯: 我们在工程中其实用到了很多类似外观模式,比如我们一个controller接收到一个请求后进行处理,但是处理的过程非常多,我们就用一个service进行封装,具体的子系统调用以及逻辑躲在service层中处理,我们对外只提供service接口,你只需要知道service的存在即可.这其实就是一种外观模式.service中处理的类我们也能看做外观类.它是打包了一系列操作的.


本文借鉴尚硅谷Java设计模式,韩顺平图解java,传送门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值