Java设计模式:外观模式

❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注点赞收藏评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉

一、外观模式的定义

外观模式(Facade Pattern)是一种结构型设计模式,旨在为系统提供一个 统一的接口,以简化系统的使用。它定义了一个高级接口,使得客户端可以更容易地与系统交互。

外观模式通过提供一个简化的接口,封装了系统中多个模块的复杂逻辑,从而隐藏系统的复杂性,使客户端更容易使用。这种模式的核心思想是通过一个外观类,将客户端与系统的详细实现隔离开来,提供一个更简单和统一的接口。


二、外观模式的结构

外观模式包含以下的重要角色:

  • 外观(Facade): 负责提供一个简化的高级接口,封装了系统中多个模块的复杂逻辑。客户端通过与外观交互来实现对系统的操作,而不直接与系统中的子系统打交道。
  • 子系统(Subsystem): 包含了系统中的多个模块,负责实际的业务逻辑。子系统是外观模式的核心,但客户端不直接与子系统交互,而是通过外观进行操作。

三、外观模式的实现

需求案例:假设要开发一个家庭电影院系统,其中包含了多个设备和模块,如投影仪、音响、灯光等。每个子系统都有各个独立的内部业务逻辑,而且彼此之间也有关联。现在,使用外观模式可以将这些复杂的子系统封装起来,为客户端提供一个简单的接口,方便控制整个家庭影院。

使用外观模式实现上述案例。类图如下:
在这里插入图片描述
 
具体的类设计如下:

子系统(投影仪):

public class Projector {

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

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

子系统(音响):

public class AudioSystem {

    public void turnOn() {
        System.out.println("音响已打开");
    }

    public void turnOff() {
        System.out.println("音响已关闭");
    }
}

子系统(灯光):

public class Lights {

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

    public void turnOff() {
        System.out.println("灯光已关闭");
    }
}

外观类:

public class HomeTheaterFacade {

    //聚合投影仪对象、音响对象、灯光对象
    private Projector projector;
    private AudioSystem audioSystem;
    private Lights lights;

    public HomeTheaterFacade() {
        this.projector = new Projector();
        this.audioSystem = new AudioSystem();
        this.lights = new Lights();
    }

    //提供一个简单的接口,封装了启动家庭电影院的复杂逻辑
    public void startHomeTheater() {
        System.out.println("------启动家庭电影院------");
        projector.turnOn();
        audioSystem.turnOn();
        lights.turnOn();
    }

    //提供一个简单的接口,封装了关闭家庭电影院的复杂逻辑
    public void stopHomeTheater() {
        System.out.println("------关闭家庭电影院------");
        projector.turnOff();
        audioSystem.turnOff();
        lights.turnOff();
    }
}

客户端类:

public class Client {

    public static void main(String[] args) {

        //使用外观模式控制家庭电影院
        HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();

        //在这里还可以进行其他操作,而不用关系子系统的复杂逻辑
        homeTheaterFacade.startHomeTheater();
        homeTheaterFacade.stopHomeTheater();
    }
}

测试结果如下:
在这里插入图片描述
 
可以看到,在上述例子中 HomeTheaterFacade 充当外观,封装了启动和关闭家庭影院的复杂逻辑。客户端只需要与外观交互,而不需要直接与投影仪、音响、灯光等子系统打交道,从而简化了系统的使用。


四、外观模式的优缺点

优点:

  1. 简化接口: 外观模式提供了一个简化的高层接口,隐藏了底层子系统的复杂性,使客户端更容易使用。
  2. 解耦系统: 外观模式将客户端与底层子系统之间的耦合度降低,客户端只需要与外观对象进行交互,而不需要直接与子系统进行交互,从而减少了客户端与子系统之间的依赖关系。
  3. 提高可维护性: 由于外观模式将复杂的子系统封装在外观对象中,如果子系统发生变化,只需修改外观对象而不需要修改客户端代码,从而提高了系统的可维护性。
  4. 提供了灵活性: 外观模式可以为不同的客户端提供不同的简化接口,根据客户端的需求进行定制,从而提供了灵活性。

缺点:

  1. 违反开闭原则: 如果需要新增或修改子系统的功能,可能需要修改外观类的代码,这违反了开闭原则。
  2. 过于简化接口: 外观模式的目的是简化子系统的接口,但有时可能会导致接口过于简化,无法满足某些特定需求,此时可能需要直接访问子系统。
  3. 不符合单一职责原则: 外观对象负责协调子系统的工作,可能承担了过多的责任,不符合单一职责原则。

五、外观模式的使用场景

外观模式适用于以下场景:

  1. 简化复杂的子系统: 当一个系统有多个复杂的子系统,而客户端只需要使用其中一部分功能时,可以使用外观模式将子系统的复杂性封装起来,提供一个简化的接口给客户端使用。
  2. 解耦客户端和子系统: 将客户端与底层子系统之间的依赖关系解耦,通过外观模式可以隐藏子系统的复杂性,从而降低耦合度,减少客户端与子系统之间的直接交互。
  3. 提供统一的接口: 一个系统的接口过于复杂,难以理解和使用时,可以使用外观模式提供一个简化的接口,将复杂的操作封装在外观类中,使得客户端更容易使用系统。
  4. 系统重构与维护: 外观模式可以作为系统重构的一种手段,通过引入外观类来封装和简化现有的子系统,提高系统的可维护性和可读性。

 
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!

  • 23
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java技术一点通

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值