java设计模式-外观模式(门面模式)Facade

193 阅读2分钟

「这是我参与2022首次更文挑战的第35天,活动详情查看:2022首次更文挑战

概念介绍

外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。

image.png

使用场景

image.png 简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。

  1).门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。

  2).子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。

  3).客户角色:通过调用Facede来完成要实现的功能。

特点:

  1- 为复杂的模块或子系统提供外界访问的模块;

  2- 子系统相互独立;

  3- 在层析结构中,可以使用外观模式定义系统的每一层的入口。

实例

其实平时我们写代码的时候也在用,相当于Controller 调用 Service ,然后service 调用 dao,比如我们一台电脑,内部组成部分有CPU 内存 硬盘 等,我们每次开关机,只需要按一下电源键就可以,而不用去单独挨个开关 CPU 内存 硬盘,这里 电源键就是我们的“门面类”。

CPU类

package com.jony.designpattern.facade;

public class CPU {
    public void start(){
        System.out.println("开启CPU");
    }

    public void shutDown(){
        System.out.println("关闭CPU");
    }
}

Disk 类

package com.jony.designpattern.facade;

public class Disk {
    public void start(){
        System.out.println("开启硬盘");
    }

    public void shutDown(){
        System.out.println("关闭硬盘");
    }
}

Memory

package com.jony.designpattern.facade;

public class Memory {
    public void start(){
        System.out.println("开启内存");
    }

    public void shutDown(){
        System.out.println("关闭内存");
    }
}

computerPower

package com.jony.designpattern.facade;

public class ComputerPower {
    private CPU cpu;
    private Disk disk;
    private Memory memory;

    public ComputerPower(){
        cpu=new CPU();
        disk=new Disk();
        memory=new Memory();
    }

    public void startPower(){
        cpu.start();
        disk.start();
        memory.start();
    }

    public void shutDownPower(){
        cpu.shutDown();
        disk.shutDown();
        memory.shutDown();
    }

}

测试类

package com.jony.designpattern.facade;

public class ClientTest {
    public static void main(String[] args) {
        ComputerPower computerPower=new ComputerPower();
        computerPower.startPower();
        System.out.println("-------------------------");
        computerPower.shutDownPower();
    }
}

执行结果

image.png

总结:

Facade模式

- 松散耦合

  使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;

- 简单易用

  客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。

- 更好的划分访问层次

  有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。