外观模式

外观模式 (Facade Pattern)
,又称为门面模式,是一种结构型设计模式,它通过为一组复杂的子系统提供一个简化的接口,使得客户端可以更容易地访问和使用这些子系统的功能。外观模式隐藏了系统的复杂性,对外提供了一个简单的接口,从而减少了外部系统与子系统之间的依赖关系,提高了系统的可维护性和可扩展性。比如,一个操作系统中有多个复杂的子系统,操作系统的
应用
与操作系统的
底层
交互便是通过
操作系统接口
来实现,应用层的开发不可能直接操作各个子系统的实现,使用外观模式实现
分层结构
,这样
隐藏复杂
的底层逻辑的同时
简化
应用层开发,大大
降低耦合度

主要结构

  • 外观 (Facade)
    :为一组复杂的子系统提供简化的接口。
  • 子系统 (Subsystem)
    :实现具体功能的复杂系统,客户端不需要直接与这些子系统交互。
  • 客户端 (Client)
    :需要使用子系统功能的外部代码或模块。

案例实现

假设我们有一个子系统涉及多个模块,比如门禁控制、灯光控制和空调控制。使用外观模式,我们可以提供一个简化的接口来控制所有这些设备。

案例类图

image

子系统类

public class DoorSystem {
    public void openDoor() {
        System.out.println("--开门...");
    }

    public void closeDoor() {
        System.out.println("--关门...");
    }
}

class LightSystem {
    public void turnOnLights() {
        System.out.println("--开灯...");
    }

    public void turnOffLights() {
        System.out.println("--关灯...");
    }
}

class ACSystem {
    public void turnOnAC() {
        System.out.println("--打开空调...");
    }

    public void turnOffAC() {
        System.out.println("--关闭空调...");
    }
}

外观类

public class SmartHomeFacade {
    private DoorSystem doorSystem;
    private LightSystem lightSystem;
    private ACSystem acSystem;

    public SmartHomeFacade() {
        this.doorSystem = new DoorSystem();
        this.lightSystem = new LightSystem();
        this.acSystem = new ACSystem();
    }

    // 提供简化接口
    public void arriveHome() {
        doorSystem.openDoor();
        lightSystem.turnOnLights();
        acSystem.turnOnAC();
    }

    public void leaveHome() {
        lightSystem.turnOffLights();
        acSystem.turnOffAC();
        doorSystem.closeDoor();
    }
}

客户端测试

public class FacadeDemo {
    public static void main(String[] args) {
        SmartHomeFacade homeFacade = new SmartHomeFacade();

        // 当到家时,外观模式简化了操作
        System.out.println("当到家时:");
        homeFacade.arriveHome();

        // 当离家时,外观模式也简化了操作
        System.out.println("当离家时:");
        homeFacade.leaveHome();
    }
}

测试结果

当到家时:

--开门...

--开灯...

--打开空调...

当离家时:

--关灯...

--关闭空调...

--关门...

简单分析

子系统类

DoorSystem

LightSystem

ACSystem
是独立的模块,它们负责具体的功能。

外观类

SmartHomeFacade
提供了一个简化的接口 (
arriveHome

leaveHome
),通过它,客户端可以简化与各个子系统的交互。

客户端代码
:客户端通过
SmartHomeFacade
调用
arriveHome

leaveHome
方法来控制门、灯和空调。

通过这种方式,外观模式将复杂的操作封装在一个简单的接口后,客户端无需了解子系统的细节,只需调用外观类提供的简化方法即可。

优缺点和应用场景

优点

  1. 简化接口
    :客户端通过外观接口与复杂的子系统进行交互,避免了直接与多个子系统打交道。
  2. 减少依赖
    :客户端只依赖外观类,减少了与复杂子系统之间的耦合度。
  3. 提高系统的灵活性
    :外观模式为系统提供了一种更简洁的方式来调用子系统,修改子系统时只需要更改外观类,而客户端无需修改。
  4. 易于使用
    :通过提供简单的接口,使得系统的使用更加直观,便于理解。

缺点

  1. 引入额外的层次
    :虽然外观模式简化了接口,但它也引入了一个额外的层次。如果系统本身已经很简单,可能就没有必要使用外观模式。
  2. 限制灵活性
    :外观模式将系统的复杂性隐藏在外部接口后,可能会限制客户端对子系统的细粒度控制。

应用场景

  • 复杂子系统的简化
    :当系统复杂,且客户端需要通过多个复杂接口进行交互时,可以使用外观模式来简化接口。
  • 集成多个子系统
    :当多个子系统协同工作时,外观模式可以为这些子系统提供一个统一的接口。
  • 需要解耦的场景
    :外观模式适用于减少客户端与子系统之间耦合度的场景。

总结

外观模式通过将复杂系统的实现细节隐藏起来,提供一个简单的接口,使得客户端代码更加简洁,降低了系统间的耦合度。这种模式非常适用于需要简化复杂子系统交互的场景。

image

需要查看往期设计模式文章的,可以在个人主页中或者文章开头的集合中查看,可关注我,持续更新中。。。


超实用的SpringAOP实战之日志记录

2023年下半年软考考试重磅消息

通过软考后却领取不到实体证书?

计算机算法设计与分析(第5版)

Java全栈学习路线、学习资源和面试题一条龙

软考证书=职称证书?

软考中级--软件设计师毫无保留的备考分享

标签: none

添加新评论