❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于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
充当外观,封装了启动和关闭家庭影院的复杂逻辑。客户端只需要与外观交互,而不需要直接与投影仪、音响、灯光等子系统打交道,从而简化了系统的使用。
四、外观模式的优缺点
优点:
- 简化接口: 外观模式提供了一个简化的高层接口,隐藏了底层子系统的复杂性,使客户端更容易使用。
- 解耦系统: 外观模式将客户端与底层子系统之间的耦合度降低,客户端只需要与外观对象进行交互,而不需要直接与子系统进行交互,从而减少了客户端与子系统之间的依赖关系。
- 提高可维护性: 由于外观模式将复杂的子系统封装在外观对象中,如果子系统发生变化,只需修改外观对象而不需要修改客户端代码,从而提高了系统的可维护性。
- 提供了灵活性: 外观模式可以为不同的客户端提供不同的简化接口,根据客户端的需求进行定制,从而提供了灵活性。
缺点:
- 违反开闭原则: 如果需要新增或修改子系统的功能,可能需要修改外观类的代码,这违反了开闭原则。
- 过于简化接口: 外观模式的目的是简化子系统的接口,但有时可能会导致接口过于简化,无法满足某些特定需求,此时可能需要直接访问子系统。
- 不符合单一职责原则: 外观对象负责协调子系统的工作,可能承担了过多的责任,不符合单一职责原则。
五、外观模式的使用场景
外观模式适用于以下场景:
- 简化复杂的子系统: 当一个系统有多个复杂的子系统,而客户端只需要使用其中一部分功能时,可以使用外观模式将子系统的复杂性封装起来,提供一个简化的接口给客户端使用。
- 解耦客户端和子系统: 将客户端与底层子系统之间的依赖关系解耦,通过外观模式可以隐藏子系统的复杂性,从而降低耦合度,减少客户端与子系统之间的直接交互。
- 提供统一的接口: 一个系统的接口过于复杂,难以理解和使用时,可以使用外观模式提供一个简化的接口,将复杂的操作封装在外观类中,使得客户端更容易使用系统。
- 系统重构与维护: 外观模式可以作为系统重构的一种手段,通过引入外观类来封装和简化现有的子系统,提高系统的可维护性和可读性。
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!