设计模式-外观模式

外观模式(Facade Pattern)是一种结构型设计模式,用于为复杂的子系统提供一个统一的接口。外观模式的目的是简化客户端与子系统之间的交互,让客户端无需了解子系统的内部实现,只需要通过外观类即可与整个子系统交互。

外观模式的关键点:

  1. 简化接口:通过外观类统一子系统的多个复杂接口,降低使用复杂度。
  2. 隐藏复杂性:客户端无需知道子系统的细节,只需要与外观类交互。
  3. 解耦:客户端与子系统解耦,有助于子系统的独立开发和维护。

外观模式的组成部分:

  1. 外观类(Facade)
    • 提供统一的接口,将复杂的子系统接口简化。
  2. 子系统(Subsystem)
    • 一个或多个类组成的复杂系统,提供各种具体的功能。
  3. 客户端(Client)
    • 使用外观类与子系统交互。

示例代码:银行业务办理

问题背景

假设银行系统中有多个子系统,如开户、验证身份、发放银行卡等。客户端需要通过外观类调用这些功能,避免直接操作各个子系统。

实现代码

// 子系统 1:身份验证
class IdentityCheck {
    public boolean verifyIdentity(String userId) {
        System.out.println("验证身份信息:" + userId);
        return true; // 简化为总是验证成功
    }
}

// 子系统 2:账户服务
class AccountService {
    public void createAccount(String userId) {
        System.out.println("为用户 " + userId + " 创建账户");
    }
}

// 子系统 3:银行卡服务
class CardService {
    public void issueCard(String userId) {
        System.out.println("为用户 " + userId + " 发放银行卡");
    }
}

// 外观类
class BankFacade {
    private IdentityCheck identityCheck;
    private AccountService accountService;
    private CardService cardService;

    public BankFacade() {
        this.identityCheck = new IdentityCheck();
        this.accountService = new AccountService();
        this.cardService = new CardService();
    }

    // 统一的对外方法
    public void openAccount(String userId) {
        if (identityCheck.verifyIdentity(userId)) {
            accountService.createAccount(userId);
            cardService.issueCard(userId);
            System.out.println("账户开立成功!");
        } else {
            System.out.println("身份验证失败,无法开立账户");
        }
    }
}

// 客户端
public class FacadePatternExample {
    public static void main(String[] args) {
        BankFacade bankFacade = new BankFacade();
        bankFacade.openAccount("用户123"); // 客户端通过外观类调用
    }
}

输出结果

验证身份信息:用户123
为用户 用户123 创建账户
为用户 用户123 发放银行卡
账户开立成功!

外观模式的优点

  1. 简化使用:客户端只需要与外观类交互,无需了解子系统的复杂逻辑。
  2. 降低耦合:客户端与子系统解耦,子系统的变更不会直接影响客户端。
  3. 提高可维护性:子系统可以独立修改,外观类也可以灵活扩展。

外观模式的适用场景

  1. 简化复杂系统的使用:当系统内部非常复杂,且客户端只需要其中部分功能时。
  2. 解耦:当需要将客户端与子系统之间的耦合关系最小化时。
  3. 统一入口:提供一个统一的接口来访问多个子系统。

外观模式非常适合应用于实际开发中,比如服务调用封装、模块之间的隔离等场景。

posted @ 2025-01-13 16:21  庞某人  阅读(29)  评论(0)    收藏  举报