当前位置: 首页 > news >正文

外观模式及运用场景

外观模式(Facade Pattern)是一种结构性设计模式,它为复杂子系统提供一个统一的接口,从而简化与这些子系统的交互。通过外观模式,客户端可以更轻松地使用复杂系统,而不必了解其内部实现。接下来,我们将通过示例代码详细讲解外观模式,并探讨它的应用场景。

外观模式示例代码

在这个示例中,我们将创建一个简单的音响系统。这个系统包括多个子系统,如 DVD 播放器、CD 播放器和音响设备。我们会为这个复杂系统提供一个外观类,以简化用户的操作。

示例代码

// DVD 播放器子系统
class DVDPlayer {public void on() {System.out.println("DVD 播放器开机");}public void play() {System.out.println("DVD 播放中...");}public void off() {System.out.println("DVD 播放器关机");}
}// CD 播放器子系统
class CDPlayer {public void on() {System.out.println("CD 播放器开机");}public void play() {System.out.println("CD 播放中...");}public void off() {System.out.println("CD 播放器关机");}
}// 音响设备子系统
class SoundSystem {public void on() {System.out.println("音响设备开机");}public void setVolume(int level) {System.out.println("音量设置为 " + level);}public void off() {System.out.println("音响设备关机");}
}// 外观类
class HomeTheaterFacade {private DVDPlayer dvdPlayer;private CDPlayer cdPlayer;private SoundSystem soundSystem;public HomeTheaterFacade() {dvdPlayer = new DVDPlayer();cdPlayer = new CDPlayer();soundSystem = new SoundSystem();}public void watchMovie() {soundSystem.on();soundSystem.setVolume(10);dvdPlayer.on();dvdPlayer.play();}public void listenToCD() {soundSystem.on();soundSystem.setVolume(5);cdPlayer.on();cdPlayer.play();}public void turnOff() {dvdPlayer.off();cdPlayer.off();soundSystem.off();}
}// 客户端代码
public class Main {public static void main(String[] args) {HomeTheaterFacade homeTheater = new HomeTheaterFacade();homeTheater.watchMovie();homeTheater.listenToCD();homeTheater.turnOff();}
}

外观模式的运用场景

外观模式可以在多个实际应用场景中发挥重要作用。以下是几个常见的运用场景及其相应的代码示例。

1. 简化复杂系统

在电商系统中,用户需要完成商品购买,这可能涉及订单、商品、支付和会员等多个子系统。我们可以通过外观类来简化用户的操作。

示例代码
// 商品子系统
class ProductService {public void listProducts() {System.out.println("列出所有商品");}
}// 订单子系统
class OrderService {public void createOrder(String product) {System.out.println("创建订单,商品: " + product);}
}// 支付子系统
class PaymentService {public void processPayment(String orderId) {System.out.println("处理订单支付,订单ID: " + orderId);}
}// 电商外观类
class ECommerceFacade {private ProductService productService;private OrderService orderService;private PaymentService paymentService;public ECommerceFacade() {productService = new ProductService();orderService = new OrderService();paymentService = new PaymentService();}public void purchaseProduct(String product) {productService.listProducts();orderService.createOrder(product);paymentService.processPayment("12345");}
}// 客户端代码
public class Main {public static void main(String[] args) {ECommerceFacade facade = new ECommerceFacade();facade.purchaseProduct("手机");}
}

2. 减少客户端处理的系统数量

在 Web 应用中,客户端可能需要处理多个系统的调用,如数据库、业务对象等。通过创建一个 DAO 层作为门面,可以简化这些操作。

示例代码
// 模拟数据库操作
class Database {public void connect() {System.out.println("连接数据库");}public void disconnect() {System.out.println("关闭数据库连接");}public String fetchData() {return "数据记录";}
}// 业务对象
class BusinessModel {private String data;public BusinessModel(String data) {this.data = data;}public void display() {System.out.println("业务数据: " + data);}
}// DAO层
class DataAccessFacade {private Database database;public DataAccessFacade() {database = new Database();}public BusinessModel getBusinessModel() {database.connect();String data = database.fetchData();database.disconnect();return new BusinessModel(data);}
}// 客户端代码
public class Main {public static void main(String[] args) {DataAccessFacade dataAccess = new DataAccessFacade();BusinessModel model = dataAccess.getBusinessModel();model.display();}
}

3. 让一个系统为多个系统工作

线程池是外观模式的另一个典型应用,它为系统提供统一的线程管理接口,使得线程的创建和使用变得简单。

示例代码
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;// 线程池外观
class ThreadPoolFacade {private ExecutorService executorService;public ThreadPoolFacade(int poolSize) {executorService = Executors.newFixedThreadPool(poolSize);}public void executeTask(Runnable task) {executorService.execute(task);}public void shutdown() {executorService.shutdown();}
}// 客户端代码
public class Main {public static void main(String[] args) {ThreadPoolFacade threadPool = new ThreadPoolFacade(5);for (int i = 0; i < 10; i++) {final int taskId = i;threadPool.executeTask(() -> {System.out.println("执行任务 " + taskId);});}threadPool.shutdown();}
}

总结

外观模式通过提供一个统一的接口,简化了复杂系统的使用,减少了客户端与多个子系统之间的直接交互。在电商系统、数据库访问和线程管理等场景中,外观模式都能有效提高系统的可维护性和可读性。合理运用外观模式,可以显著提升开发效率和用户体验。

http://www.lryc.cn/news/475898.html

相关文章:

  • PyQt5实战——多脚本集合包,UI以及工程布局(二)
  • Python 数据结构对比:列表与数组的选择指南
  • gem5运行简单RISC-V全系统模拟
  • 洛谷 P1195 口袋的天空
  • ffmpeg视频滤镜:膨胀操作-dilation
  • 3.3 windows,ReactOS系统中页面的换出----2,结构体PHYSICAL_PAGE
  • lvgl
  • 【django】RESTful API 设计指南
  • 提升大数据量分页查询性能:深分页优化全解
  • WPF 实现冒泡排序可视化
  • Claude 3.5 新功能 支持对 100 页的PDF 图像、图表和图形进行可视化分析
  • 正式开源:从 Greenplum 到 Cloudberry 迁移工具 cbcopy 发布
  • Python如何读写文件?
  • 100种算法【Python版】第38篇——Boyer-Moore算法
  • 贪心算法---java---黑马
  • 程序员的减压秘籍:高效与健康的平衡艺术
  • 2024 年 QEMU 峰会纪要
  • C++/list
  • 刘艳兵-DBA015-对于属于默认undo撤销表空间的数据文件的丢失,哪条语句是正确的?
  • 树莓派基本设置--10.使用MIPI摄像头
  • 【ARCGIS实验】地形特征线的提取
  • HTML 基础标签——表格标签<table>
  • 线程函数和线程启动的几种不同形式
  • 数组排序简介-基数排序(Radix Sort)
  • 进程间通信(命名管道 共享内存)
  • Python 网络爬虫教程:从入门到高级的全面指南
  • 深度学习:正则化(Regularization)详细解释
  • Freertos学习日志(1)-基础知识
  • CentOS9 Stream 支持输入中文
  • 基于向量检索的RAG大模型