Java案例中的门面模式怎么写?

wen java案例 2

本文目录导读:

Java案例中的门面模式怎么写?

  1. Java门面模式实现案例
  2. 门面模式的关键要点

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");
    }
}

门面模式的关键要点

  1. 核心思想:为复杂的子系统提供统一的简化接口

  2. 主要角色

    • Facade(门面):提供简化接口,封装子系统操作
    • Subsystem(子系统):实现具体功能的复杂类集合
    • Client(客户端):通过门面类与子系统交互
  3. 使用场景

    • 需要为复杂系统提供简单接口
    • 客户端与子系统存在大量依赖关系
    • 系统需要分层设计,降低耦合
  4. 优点

    • 简化客户端使用,减少学习成本
    • 降低系统耦合度
    • 提供更好的系统组织层次
  5. 注意事项

    • 门面不应成为"万能类",避免过于臃肿
    • 不影响客户端直接使用子系统(可选)
    • 可以为不同场景创建多个门面

抱歉,评论功能暂时关闭!