【设计模式】门面模式

文章目录

  • 1.门面模式定义
  • 2. 门面模式的角色
  • 3.门面模式实战案例
    • 3.1.场景说明
    • 3.2.关系图
    • 3.3.代码实现
  • 4.门面模式优缺点
  • 5.门面模式适用场景
  • 6.门面模式总结

【设计模式】门面模式_第1张图片

主页传送门: 传送

1.门面模式定义

       门面模式(Facade Pattern)也叫做外观模式,是一种比较常用的封装模式。其定义如下:

Provide a unified interface to a set of interfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.

       即:要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。 门面模式提供一个高层次的接口,使得子系统更易于使用。
       其通用类图如下:
【设计模式】门面模式_第2张图片

2. 门面模式的角色

在门面模式中,出现了两个角色:

  • 门面(Facade)角色 :
    客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
  • 子系统(SubSystem)角色 :
    可以同时有一个或者多个子系统。每个子系统都不是一个单独的类,而是一个类的集合(如上面的子系统就是由ModuleA、ModuleB、ModuleC三个类组合而成)。每个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。

3.门面模式实战案例

3.1.场景说明

       下面我们写一个简单的电脑启动的例子( 这个例子在许多设计模式教程中都曾出现,笔者认为这是最好的例子之一,直接借用了 )。
启动电脑我们通常只需要按下开机键就可以了,但电脑内部实际上启动了多个模块,如 CPU,硬盘,内存等。

3.2.关系图

       使用门面模式来实现的结构图如下:
【设计模式】门面模式_第3张图片

3.3.代码实现

开机键就是一个很好的门面,让程序员们无需了解 CPU 、内存和硬盘如何启动。

//CPU
public class CPU {
    public void start(){
        System.out.println("启动CPU");
    }
}
//硬盘
public class Disk {
    public void start(){
        System.out.println("启动硬盘");
    }
}
//内存
public class Memory {
    public void start(){
        System.out.println("启动内存");
    }
}

如果没有开机键,我们需要这么做:

new CPU().start();
new Disk().start();
new Memory().start();

有了开机键,这些操作都交给开机键去做:

//开机键
public class StartBtn {

    public void start(){
        new CPU().start();
        new Disk().start();
        new Memory().start();
    }
}

而我们只需要:

new StartBtn().start();

4.门面模式优缺点

门面模式的优点包括:

  • 减少系统的相互依赖:门面模式可以让客户端只需要依赖门面对象,而与子系统无关,从而降低了系统耦合。
  • 提高灵活性:只要不修改门面对象的对外接口,不管子系统内部如何变化,都不会影响到客户端,因此提高了系统的灵活性。
  • 提高安全性:外部只能通过门面访问子系统的功能,门面没有开放的就不能访问,从而提高了子系统的安全性。

门面模式的缺点包括:

  • 不符合开闭原则,当需要修改子系统功能时,需要修改门面角色的代码,风险较大。
  • 如果门面角色与底层实现紧密耦合,修改底层实现时可能需要同时修改门面角色,增加了维护的难度和成本。

5.门面模式适用场景

门面模式适用于以下场景:

  1. 为一个复杂的模块或子系统提供一个简洁的供外界访问的接口。这是门面模式最常用的应用场景,通过门面模式,客户端可以更加方便地使用子系统的功能,而无需了解子系统的内部实现细节。
  2. 希望提高子系统的独立性。门面模式可以提供一个统一的接口,将客户端与子系统隔离开来,从而降低了客户端对子系统的依赖程度,提高了子系统的独立性和可维护性。
  3. 当子系统由于不可避免的暂时原因导致可能存在bug,可以通过门面模式提供一个高层接口,隔离客户端与子系统的直接交互,预防代码污染。在这种情况下,门面模式可以提供一个过渡层,避免客户端直接访问可能存在问题的子系统,从而提高了系统的稳定性和可靠性。

需要注意的是,当子系统需要频繁地修改或扩展时,门面模式可能会增加额外的开发成本和维护难度,因为每次修改或扩展都需要同时修改门面角色和底层实现。因此,在选择是否使用门面模式时,需要根据实际情况权衡利弊。

6.门面模式总结

     门面模式是一种结构性设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。门面模式的主要目的是将复杂的子系统封装起来,提供一个更简单的接口,使子系统更容易使用。
     门面模式适用于为复杂的模块或子系统提供一个简洁的访问接口、提高子系统的独立性和稳定性等场景。然而,在使用门面模式时需要注意开闭原则的问题,以及门面角色和底层实现之间的耦合度,以避免引入额外的维护问题和风险。

如果喜欢的话,欢迎 关注 点赞 评论 收藏 一起讨论
你的支持就是我✍️创作的动力!

你可能感兴趣的:(设计模式,设计模式,外观模式,java,门面模式)