Java设计模式十:外观模式

  外观(Facade)模式:为多个复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。

一、定义与特点

  外观(Facade)模式的定义:是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

  外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。

  这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

  软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。

  • 外观模式适用场景
    1、对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
    2、当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
    3、当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。

二、实现方式

(1)创建接口

  创建Computer接口类,定义start方法

public interface Computer {
    void start();
}

(2)实现接口

  实现Computer接口,CPU开始工作

public class Cpu implements Computer {

    @Override
    public void start() {
        System.out.println("start cpu.");
    }
}

  实现Computer接口,Memory开始工作

public class Memory implements Computer {

    @Override
    public void start() {
        System.out.println("start memory.");
    }
}

  实现Computer接口,Disk开始工作

public class Disk implements Computer {

    @Override
    public void start() {
        System.out.println("start disk.");
    }
}

(3)模式示例

  创建外观类,封装计算机启动需要的设备,用于对外展现

public class FacadeDemo {

    private Cpu cpu;
    private Memory memory;
    private Disk disk;

    public FacadeDemo() {
        cpu = new Cpu();
        memory = new Memory();
        disk = new Disk();
    }

    public void startCpu() {
        cpu.start();
    }

    public void startMemory() {
        memory.start();
    }

    public void startDisk() {
        disk.start();
    }
}

(4)测试实现

  测试外观模式的实现过程

public class Test {

    public static void main(String[] args) {
        FacadeDemo demo = new FacadeDemo();
        demo.startCpu();
        demo.startMemory();
        demo.startDisk();
    }
}

  测试输出内容

start cpu.
start memory.
start disk.

三、相关内容

  • 优缺点
    1、减少系统相互依赖。
    2、提高灵活性。
    3、提高了安全性。
    4、不能很好地限制客户使用子系统类。
    5、增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

  • 模式结构
    1、外观(Facade)角色:为多个子系统对外提供一个共同的接口。
    2、子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。
    3、客户(Client)角色:通过一个外观角色访问各个子系统的功能。

  • 参考文章
    1、http://c.biancheng.net/view/1369.html
    2、https://www.runoob.com/design-pattern/facade-pattern.html


更新时间:2020-08-28 11:38:21

本文由 新逸Cary 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
原文链接:https://blog.xinac.cn/archives/java-design-facade.html
最后更新:2020-08-28 11:38:21

评论

Your browser is out of date!

Update your browser to view this website correctly. Update my browser now

×