结构型-外观模式(Facade Pattern)

news/2025/1/3 5:34:39/

概述

外观模式是一种结构型设计模式,它提供了一个统一的接口,用于访问子系统中的一组接口。通过在外观类中定义一个高层接口,外观模式隐藏了子系统的复杂性,并将客户端与子系统的内部逻辑解耦。

优点:

  • 简化了客户端与子系统之间的交互,降低了客户端与子系统的耦合度。
  • 提供了一个简单的接口,使得子系统更易于使用。
  • 隔离了客户端和子系统之间的细节,使得子系统的具体实现可以独立变化。

缺点:

  • 如果需要修改子系统的行为,可能需要修改外观类的代码。
  • 外观类可能会变得庞大,包含了很多与子系统相关的方法。这可能违反了单一职责原则。

适用场景:

  • 当你需要为一个复杂的子系统提供一个简单的接口时,可以使用外观模式。例如,你可以使用外观模式来封装一个复杂的第三方库或者服务。
  • 当你希望客户端与子系统之间解耦,以降低它们的依赖关系时,可以使用外观模式。
  • 当子系统的接口频繁变化,或者有多个接口实现时,可以使用外观模式来统一客户端的调用。

示例

一个常见的实际应用场景是购物平台。假设你正在开发一个电子商务平台,需要提供一个统一的购物接口,包括添加商品到购物车、生成订单、支付等操作。你可以使用外观模式来封装底层的购物逻辑,以提供一个简单的购物接口给客户端使用。

以下是一个示例代码:

class ShoppingCart {public void addProduct(String productId) {System.out.println("添加商品到购物车:" + productId);}public void generateOrder() {System.out.println("生成订单");}public void payOrder(String orderId) {System.out.println("支付订单:" + orderId);}
}class ShoppingFacade {private ShoppingCart shoppingCart;public ShoppingFacade() {this.shoppingCart = new ShoppingCart();}public void addToCart(String productId) {shoppingCart.addProduct(productId);}public void checkout() {shoppingCart.generateOrder();}public void pay(String orderId) {shoppingCart.payOrder(orderId);}
}public class Main {public static void main(String[] args) {ShoppingFacade shoppingFacade = new ShoppingFacade();shoppingFacade.addToCart("P001");shoppingFacade.addToCart("P002");shoppingFacade.checkout();shoppingFacade.pay("O001");}
}

输出结果:

添加商品到购物车:P001
添加商品到购物车:P002
生成订单
支付订单:O001


http://www.ppmy.cn/news/984127.html

相关文章

11-2_Qt 5.9 C++开发指南_QSqlQueryModel的使用(QSqlQueryModel 只能作为只读数据源使用,不可以编辑数据)

文章目录 1 QSqlQueryModel 功能概述2 使用 QSqlQueryModel 实现数据查询2.1 实例功能2.2 可视化UI设计2.3 主窗口类定义(去除自动生成的槽函数)2.4 打开数据库2.5 记录移动 1 QSqlQueryModel 功能概述 从下图中可以看到,QSqlQueryModel 是 …

php-golang-jsonrpc2.0 rpc-codec/jsonrpc2和tivoka/tivoka实践

golang代码: package main import ( "context" "net" "net/rpc" "github.com/powerman/rpc-codec/jsonrpc2" ) type App struct{} type Res struct { Code int json:"code" Msg string json:"msg&quo…

P5720 【深基4.例4】一尺之棰

题目描述 《庄子》中说到,“一尺之棰,日取其半,万世不竭”。第一天有一根长度为 a a a 的木棍,从第二天开始,每天都要将这根木棍锯掉一半(每次除 2 2 2,向下取整)。第几天的时候木…

python测试开发面试常考题:装饰器

目录 简介 应用 第一类对象 装饰器 描述器descriptor 资料获取方法 简介 Python 装饰器是一个可调用的(函数、方法或类),它获得一个函数对象 func_in 作为输入,并返回另一函数对象 func_out。它用于扩展函数、方法或类的行为。 装饰器模式通常用…

《现代C++教程》笔记(4)

文章目录 4 容器4.1 线性容器std::arraystd::forward_list 4.2 无序容器4.3 元组基本操作运行期索引元组合并与遍历 4 容器 4.1 线性容器 std::array 为什么要引入 std::array 而不是直接使用 std::vector? 已经有了传统数组,为什么要用 std::array?…

NSS [SWPUCTF 2021 新生赛]pop

NSS [SWPUCTF 2021 新生赛]pop 倒推一下,最后一步是调用getflag函数,admin和password要求为w44m和08067。 第一步应该从w22m类的魔术方法__destruct()入手,所以中间第二步应该是w33m(第一步w22m类的魔术方法__destruct()里面的ec…

Android 截图功能实现

Android 截图功能实现 简介效果图功能实现1. 截取当前可见范围屏幕2. 截取当前可见范围屏幕(不包含状态栏)3. 截取某个控件4. 截取ScrollView5. 长截图6. 截屏动画效果7. 显示截屏结果,自动消失6. 完整代码 简介 在Android应用中开发截图功能…

element-ui 合并表格行

element-ui 合并表格行操作 需求描述 动态获取数据后,将ID相同的行,ID合并成一个。 官方方法 //rowIndex当前行号 columnIndex当前列号 由此可知道每一行渲染时都会调用当前方法,只不过在渲染过程中设置了它合并的行数和列数,…