✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。
🍎个人主页:Meteors.的博客
💞当前专栏:设计模式
✨特色专栏:知识分享
🥭本文内容:23种设计模式------外观模式(Facade Pattern)
📚 ** ps ** :阅读文章如果有问题或者疑惑,欢迎在评论区提问或指出
目录
[一. 背景](#一. 背景)
[二. 简介](#二. 简介)
[三. 核心思想](#三. 核心思想)
[四. 适用场景](#四. 适用场景)
[五. 代码示例](#五. 代码示例)
[六. 优化方式](#六. 优化方式)
[七 总结](#七 总结)
一. 背景
外观模式的特点光听这个名字可能有些难理解,可以理解为它就是给一些封装好的内部类一个外部的外观(多对一),作用就像向对象的三大特性之一的封闭性一样,防止内部元素对外展示。用设计模式的设计原则来看,它满足了两个设计原则,迪米特法则( 外观模式让客户端只与外观类打交道,而不需要了解复杂的子系统内部多个类,减少了对象之间的依赖,符合"只与直接朋友通信"的原则 ) 和单一职责原则 ( 外观类负责简化接口,子系统类各自负责自己的业务,职责更单一 **),**下面内容会对它进行详细的介绍。
二. 简介
Facade Pattern(外观模式)是23种设计模式中的一种结构型模式,它为复杂的子系统提供了一个简单的接口。外观模式隐藏了子系统的复杂性,为客户端提供了一个统一的访问接口,使得客户端更容易使用子系统。
三. 核心思想
外观模式通过创建一个外观类 ,将子系统的复杂性封装在这个外观类中,客户端只需要与外观类交互,而不需要直接与子系统的各个组件交互。这样可以降低客户端与子系统之间的耦合度, 提高系统的可维护性和可扩展性。
四. 适用场景
- 当客户端需要使用一个复杂的子系统时,可以使用外观模式简化客户端的使用。
- 当需要为复杂的子系统提供一个简单的接口时,可以使用外观模式。
- 当需要将客户端与子系统解耦时,可以使用外观模式
五. 代码示例
下面是一个简单的外观模式的代码案例,以一个家庭影院系统为例:
java// 子系统:DVD播放器 class DvdPlayer { public void on() { System.out.println("DVD Player is on"); } public void play() { System.out.println("DVD Player is playing"); } public void off() { System.out.println("DVD Player is off"); } } // 子系统:投影仪 class Projector { public void on() { System.out.println("Projector is on"); } public void setInput(String input) { System.out.println("Projector input is set to " + input); } public void off() { System.out.println("Projector is off"); } } // 子系统:音响系统 class SoundSystem { public void on() { System.out.println("Sound System is on"); } public void setVolume(int volume) { System.out.println("Sound System volume is set to " + volume); } public void off() { System.out.println("Sound System is off"); } } // 外观类:家庭影院外观 class HomeTheaterFacade { private DvdPlayer dvdPlayer; private Projector projector; private SoundSystem soundSystem; public HomeTheaterFacade(DvdPlayer dvdPlayer, Projector projector, SoundSystem soundSystem) { this.dvdPlayer = dvdPlayer; this.projector = projector; this.soundSystem = soundSystem; } public void watchMovie() { System.out.println("Get ready to watch a movie..."); dvdPlayer.on(); projector.on(); projector.setInput("DVD"); soundSystem.on(); soundSystem.setVolume(10); dvdPlayer.play(); } public void endMovie() { System.out.println("Shutting down the movie theater..."); dvdPlayer.off(); projector.off(); soundSystem.off(); } } // 客户端代码 public class Client { public static void main(String[] args) { DvdPlayer dvdPlayer = new DvdPlayer(); Projector projector = new Projector(); SoundSystem soundSystem = new SoundSystem(); HomeTheaterFacade homeTheater = new HomeTheaterFacade(dvdPlayer, projector, soundSystem); homeTheater.watchMovie(); System.out.println("--------------------"); homeTheater.endMovie(); } }
六. 优化方式
- ***使用工厂方法创建外观对象:***可以通过工厂方法来创建外观对象,这样可以更好地管理外观对象的创建过程。
- ***抽象外观类:***可以创建一个抽象外观类,让不同的外观类继承这个抽象类,这样可以更好地扩展外观模式。
- ***外观模式与单例模式结合:***可以将外观类设计为单例模式,确保系统中只有一个外观实例。
- ***使用配置文件:***可以使用配置文件来指定外观类和子系统类的对应关系,这样可以更加灵活地配置系统。
- ***分层外观:***对于特别复杂的系统,可以设计多层外观,每一层负责一部分功能,这样可以更好地组织代码。
七 总结
外观模式是一种非常实用的设计模式,它可以简化复杂系统的使用,提高代码的可维护性和可扩展性。在实际开发中,当我们面对一个复杂的子系统时,可以考虑使用外观模式来封装子系统的复杂性,为客户端提供一个简单的接口。
最后,
其它设计模式会陆续更新,希望文章对你有所帮助!