本文目录导读:

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(客户端):通过门面类与子系统交互
-
使用场景:
- 需要为复杂系统提供简单接口
- 客户端与子系统存在大量依赖关系
- 系统需要分层设计,降低耦合
-
优点:
- 简化客户端使用,减少学习成本
- 降低系统耦合度
- 提供更好的系统组织层次
-
注意事项:
- 门面不应成为"万能类",避免过于臃肿
- 不影响客户端直接使用子系统(可选)
- 可以为不同场景创建多个门面
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播