Java外观模式详解:通过Facade类简化子系统交互

山间有风
山间有风
发布时间:2026-10-15| 5人浏览过
原创

外观模式用于为复杂的子系统提供一个简化的统一接口。在Java开发中,当需要协调多个类或模块的协作时,可通过定义一个Facade类来屏蔽底层复杂性,使客户端只需与外观类交互即可完成任务,有效降低耦合度并提升代码可维护性。

什么是外观模式

在软件系统中,当一个类需要与多个不同的子系统打交道时,为了减少该类与子系统之间的直接依赖关系,可以采用外观模式。该模式的核心是为这些子系统提供一个统一的“外观类”(Facade)进行功能封装。外观类负责处理与各个子系统类的交互细节,而用户类(客户端)只需要与外观类交互,从而简化了整体系统的调用流程,降低了组件间的耦合。

外观模式的设计要素

  1. 子系统(Subsystems):由若干个协作的类组成集合,共同为用户提供完整功能。关键点在于,子系统中的类不应包含对外观类的引用,保持自身的独立性。
  2. 外观类(Facade):该类持有子系统中全部或部分实例的引用。它的职责是替代分散的子系统和用户打交道,将具体的业务逻辑整合在外观层中调用。

基于广告系统的代码实现

假设有一个广告投放系统,涉及三个核心环节:广告字数检查计费、价格计算以及排版设置。我们将分别定义这三个子系统类,并通过一个外观类来整合它们。

第一步:定义子系统类

首先创建子系统的具体实现。包括检查字数并记录金额的 CheckWord 类,根据字数计算价格的 Charge 类,以及执行排版的 TypeSetting 类。

/**
 * 子系统1
 * 广告检查系统
 * 完成广告字数计算
 */
public class CheckWord {
    int amount;
    String ad;
    
    public CheckWord (String ad){
        this.ad = ad;
    }
    
    /**
     * 计算广告字数,按字数收费
     * @return
     */
    public int setAmout( ){
        System.out.println("计算广告字数");
        amount = ad.length();
        return amount;
    }
}

/**
 * 子系统2
 * 计算广告价格
 */
public class Charge {
    CheckWord word;
    public int price;
    
    public Charge(CheckWord word){
        this.word = word;
    }
    
    public int giveCharge( ){
        //计算广告价格
        System.out.println("计算价格");
        price = word.amount*100;
        return price;
    }
}

/**
 * 子系统3
 * 广告排版
 */
public class TypeSetting {
    private String ad;
    
    public TypeSetting(String ad){
        this.ad = ad;
    }
    
    public void typeSetting(){
        System.out.println("广告排版");
    }
}

第二步:构建外观类

定义 AdFacade 外观类。在该类中初始化所需的子系统实例,并暴露一个聚合方法 finishAdTask() 供外部调用。这样,用户无需关心具体的调用顺序和依赖关系。

/**
 * 外观类
 * 包含子系统中全部或部分类。
 * 这个类替代子系统和用户类打交道,
 * 所有用户想要完成的功能由这个类进行调用,
 * 避免了用户类和子系统过多的依赖。
 */
public class AdFacade {
    private CheckWord checkWord;
    private Charge charge;
    private TypeSetting typeSetting;
    
    public AdFacade(String ad){
        this.checkWord = new CheckWord(ad);
        this.charge = new Charge(checkWord);
        this.typeSetting = new TypeSetting(ad);
    }
    
    /**
     * 完成用户发布广告的任务
     */
    public void finishAdTask(){
        checkWord.setAmout();
        charge.giveCharge();
        typeSetting.typeSetting();
    }
}

第三步:客户端测试调用

在主程序中,直接使用外观类即可完成复杂的子系统联动操作,代码简洁清晰。

public class Main {
    public static void main(String args[]){
        String ad ="hello world";
        // 直接使用外观类,无需手动实例化和编排子系统
        AdFacade adFacade = new AdFacade(ad);
        adFacade.finishAdTask();
    }
}

通过上述步骤,我们清晰地展示了如何将分散的子系统逻辑封装在Facade背后。以上就是Java外观模式(Facade)示例详解的详细内容,更多关于Java设计模式的内容请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。