外观模式
结构型模式
访问次数: 12
外观模式为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,这个接口使得这一子系统更加容易使用。
视频教程
类图
classDiagram
class Facade {
-subsystemA: SubsystemA
-subsystemB: SubsystemB
-subsystemC: SubsystemC
+operation()
}
class SubsystemA {
+operationA()
}
class SubsystemB {
+operationB()
}
class SubsystemC {
+operationC()
}
class Client {
-facade: Facade
+doSomething()
}
Facade --> SubsystemA
Facade --> SubsystemB
Facade --> SubsystemC
Client --> Facade
源代码示例
// 子系统A
class SubsystemA {
public void operationA() {
System.out.println("SubsystemA operationA");
}
}
// 子系统B
class SubsystemB {
public void operationB() {
System.out.println("SubsystemB operationB");
}
}
// 子系统C
class SubsystemC {
public void operationC() {
System.out.println("SubsystemC operationC");
}
}
// 外观类
class Facade {
private SubsystemA subsystemA;
private SubsystemB subsystemB;
private SubsystemC subsystemC;
public Facade() {
this.subsystemA = new SubsystemA();
this.subsystemB = new SubsystemB();
this.subsystemC = new SubsystemC();
}
public void operation() {
System.out.println("Facade operation");
subsystemA.operationA();
subsystemB.operationB();
subsystemC.operationC();
}
}
// 客户端
class Client {
private Facade facade;
public Client() {
this.facade = new Facade();
}
public void doSomething() {
facade.operation();
}
}
# Python代码待添加
应用场景
当需要为复杂的子系统提供一个简单的接口时。应用场景包括:
1)家庭影院系统,需要控制电视、音响、DVD播放器等设备,通过外观模式提供一键开启电影模式的简单接口
2)银行系统,将复杂的账户管理、转账、贷款等子系统封装成简单的用户操作接口
3)电商平台,将商品管理、订单处理、支付、物流等复杂子系统封装成统一的购物接口
4)操作系统API,将底层的文件系统、网络、内存管理等复杂操作封装成简单的系统调用接口
5)游戏引擎,将渲染、物理、音频、输入等子系统封装成简单的游戏开发接口
6)微服务网关,将多个微服务的复杂调用逻辑封装成统一的API网关接口
精选场景详解 —— 家庭影院:一键开启观影模式
问题背景
看电影要依次开电视、切 HDMI、开功放、设环绕声、开 DVD/流媒体。用户不想了解子系统细节,只想「一键观影 / 一键关闭」。
模式如何解决
选用外观(Facade)模式:HomeTheaterFacade 封装对 TV、Amplifier、Player 等子系统的调用顺序,对外提供 watchMovie()、endMovie() 等粗粒度 API。
外观不增加新能力,而是降低子系统使用复杂度,为上层提供稳定入口。子系统类仍可被高级用户直接调用。
与适配器区别:适配器重在「接口转换」;外观重在「简化一组接口」。电商下单门面、API 网关也是同类思想。
场景模型(角色映射)
将模式中的抽象角色映射到该业务领域的具体类:
classDiagram
class HomeTheaterFacade {
-tv: Television
-amp: Amplifier
-player: StreamingPlayer
+watchMovie(name: String)
+endMovie()
}
class Television {
+on()
+setInput(source: String)
}
class Amplifier {
+on()
+setSurroundSound()
+setVolume(level: int)
}
class StreamingPlayer {
+on()
+play(title: String)
+stop()
}
class User {
+enjoyMovie()
}
HomeTheaterFacade --> Television
HomeTheaterFacade --> Amplifier
HomeTheaterFacade --> StreamingPlayer
User --> HomeTheaterFacade