本文目录导读:

Java门面模式实现案例
门面模式(Facade Pattern)是一种结构型设计模式,它为一组复杂的子系统提供一个统一的简化接口,下面通过几个具体案例来展示如何在Java中实现门面模式。
案例1:影院系统
这个案例模拟一个家庭影院系统,包含多个子系统组件,门面类提供简化的操作接口。
// 子系统类:投影仪
class Projector {
public void on() {
System.out.println("投影仪已打开");
}
public void off() {
System.out.println("投影仪已关闭");
}
public void setInput(String source) {
System.out.println("投影仪输入源设置为: " + source);
}
}
// 子系统类:音响系统
class SoundSystem {
public void on() {
System.out.println("音响系统已打开");
}
public void off() {
System.out.println("音响系统已关闭");
}
public void setVolume(int level) {
System.out.println("音量设置为: " + level);
}
}
// 子系统类:DVD播放器
class DVDPlayer {
public void on() {
System.out.println("DVD播放器已打开");
}
public void off() {
System.out.println("DVD播放器已关闭");
}
public void play(String movie) {
System.out.println("正在播放电影: " + movie);
}
}
// 门面类:家庭影院门面
class HomeTheaterFacade {
private Projector projector;
private SoundSystem soundSystem;
private DVDPlayer dvdPlayer;
public HomeTheaterFacade() {
this.projector = new Projector();
this.soundSystem = new SoundSystem();
this.dvdPlayer = new DVDPlayer();
}
// 简化接口:看电影
public void watchMovie(String movie) {
System.out.println("=== 准备看电影 ===");
projector.on();
projector.setInput("DVD");
soundSystem.on();
soundSystem.setVolume(50);
dvdPlayer.on();
dvdPlayer.play(movie);
System.out.println("=== 开始观影 ===");
}
// 简化接口:结束观影
public void endMovie() {
System.out.println("=== 关闭影院系统 ===");
dvdPlayer.off();
soundSystem.off();
projector.off();
System.out.println("=== 系统已关闭 ===");
}
}
// 客户端使用
public class FacadePatternDemo {
public static void main(String[] args) {
HomeTheaterFacade homeTheater = new HomeTheaterFacade();
// 客户只需调用简化接口
homeTheater.watchMovie("《流浪地球》");
System.out.println();
homeTheater.endMovie();
}
}
案例2:电子邮件系统
这个案例展示一个电子邮件发送系统,包含多个复杂步骤,门面类将其封装为简单接口。
// 子系统类:邮件验证
class EmailValidator {
public void validate(String email) {
if (email == null || !email.contains("@")) {
throw new IllegalArgumentException("无效的邮箱地址: " + email);
}
System.out.println("邮箱验证通过: " + email);
}
}
// 子系统类:邮件格式化
class EmailFormatter {
public String format(String subject, String content) {
String formattedContent = "【" + subject + "】\n" + content;
System.out.println("邮件格式化完成");
return formattedContent;
}
}
// 子系统类:邮件发送器
class EmailSender {
public void send(String to, String content) {
System.out.println("正在发送邮件至: " + to);
System.out.println("邮件内容: " + content);
System.out.println("邮件发送成功");
}
}
// 子系统类:邮件日志记录
class EmailLogger {
public void log(String operation, String details) {
System.out.println("日志记录 - " + operation + ": " + details);
}
}
// 门面类:电子邮件系统门面
class EmailSystemFacade {
private EmailValidator validator;
private EmailFormatter formatter;
private EmailSender sender;
private EmailLogger logger;
public EmailSystemFacade() {
this.validator = new EmailValidator();
this.formatter = new EmailFormatter();
this.sender = new EmailSender();
this.logger = new EmailLogger();
}
// 简化接口:发送邮件
public void sendEmail(String to, String subject, String content) {
System.out.println("=== 开始发送邮件 ===");
// 验证邮箱
validator.validate(to);
// 格式化内容
String formattedContent = formatter.format(subject, content);
// 发送邮件
sender.send(to, formattedContent);
// 记录日志
logger.log("发送邮件", "至 " + to + ", 主题: " + subject);
System.out.println("=== 邮件发送完成 ===");
}
}
// 客户端使用
public class EmailFacadeDemo {
public static void main(String[] args) {
EmailSystemFacade emailSystem = new EmailSystemFacade();
// 客户只需调用一个方法
emailSystem.sendEmail(
"user@example.com",
"Java设计模式",
"这是关于门面模式的示例代码"
);
}
}
案例3:数据库操作门面(简化版)
// 子系统类:数据库连接
class DatabaseConnection {
public void connect() {
System.out.println("数据库连接已建立");
}
public void disconnect() {
System.out.println("数据库连接已关闭");
}
}
// 子系统类:SQL查询执行器
class QueryExecutor {
public void executeQuery(String sql) {
System.out.println("执行SQL查询: " + sql);
}
public void executeUpdate(String sql) {
System.out.println("执行SQL更新: " + sql);
}
}
// 子系统类:结果处理
class ResultProcessor {
public void processResult() {
System.out.println("处理查询结果");
}
}
// 子系统类:事务管理器
class TransactionManager {
public void beginTransaction() {
System.out.println("开始事务");
}
public void commit() {
System.out.println("提交事务");
}
public void rollback() {
System.out.println("回滚事务");
}
}
// 门面类:数据库操作门面
class DatabaseFacade {
private DatabaseConnection connection;
private QueryExecutor queryExecutor;
private ResultProcessor resultProcessor;
private TransactionManager transactionManager;
public DatabaseFacade() {
this.connection = new DatabaseConnection();
this.queryExecutor = new QueryExecutor();
this.resultProcessor = new ResultProcessor();
this.transactionManager = new TransactionManager();
}
// 简化接口:执行查询
public void queryData(String sql) {
try {
connection.connect();
queryExecutor.executeQuery(sql);
resultProcessor.processResult();
} finally {
connection.disconnect();
}
}
// 简化接口:执行更新操作(带事务)
public void updateData(String sql) {
try {
connection.connect();
transactionManager.beginTransaction();
queryExecutor.executeUpdate(sql);
transactionManager.commit();
System.out.println("数据更新成功");
} catch (Exception e) {
transactionManager.rollback();
System.out.println("数据更新失败,事务已回滚: " + e.getMessage());
} finally {
connection.disconnect();
}
}
}
// 客户端使用
public class DatabaseFacadeDemo {
public static void main(String[] args) {
DatabaseFacade dbFacade = new DatabaseFacade();
// 执行简单查询
dbFacade.queryData("SELECT * FROM users WHERE id = 1");
System.out.println();
// 执行更新操作
dbFacade.updateData("UPDATE users SET name = '张三' WHERE id = 1");
}
}
门面模式的关键要点
-
核心思想:为复杂的子系统提供统一的简化接口
-
主要角色:
- Facade(门面):提供简化接口,封装子系统操作
- Subsystem(子系统):实现具体功能的复杂类集合
- Client(客户端):通过门面类与子系统交互
-
使用场景:
- 需要为复杂系统提供简单接口
- 客户端与子系统存在大量依赖关系
- 系统需要分层设计,降低耦合
-
优点:
- 简化客户端使用,减少学习成本
- 降低系统耦合度
- 提供更好的系统组织层次
-
注意事项:
- 门面不应成为"万能类",避免过于臃肿
- 不影响客户端直接使用子系统(可选)
- 可以为不同场景创建多个门面