当前位置: 首页 > article >正文

【设计模式-结构型】外观模式

一、什么是外观模式

        外观模式就像公司里的管理层。最初,公司只有一个老板直接管理10个员工,员工们事无巨细地向老板汇报,导致老板忙得不可开交。当员工数量增加到30人时,老板不堪重负,必须进行分层管理,提拔或招揽一些管理人才。这些管理人员就像是外观模式中的外观类,他们负责将老板的命令分解并分配给具体的员工执行,然后将结果汇报给老板。老板只需要下达命令并接收结果,无需了解具体的执行细节。

        这种模式在硬件和软件设计中也很常见。比如苹果手机的设计,通过一个简洁的外观(如只有一个主按键),将复杂的功能聚合起来,用户只需通过这个简单的界面就能操作手机的各种功能,而不需要了解内部的复杂实现。这正是外观模式的应用,它通过提供一个简化的接口,让客户端(用户或老板)能够轻松地与复杂的子系统(员工或功能模块)进行交互,从而达到简化操作、提高效率的目的。

二、为什么用外观模式

简化、提供统一的接口:外观模式提供了一个简化的接口提供了一个统一的高层接口,客户端(老板)可以通过这个接口(管理层)与复杂的子系统(基层)进行交互,而不需要了解子系统的内部细节。

降低耦合度:通过外观类,客户端与子系统之间的耦合度降低。子系统的变化对客户端的影响较小,客户端不需要因为子系统内部的变化而频繁修改代码。

分层架构:支持分层架构,可以将复杂的系统分解为多个子系统,每个子系统都有自己的外观类。这有助于更好地组织和管理代码,提高系统的可扩展性和可维护性。

三、外观模式示例

我们用一个简单的Java示例来模拟老板和员工之间的交互,展示外观模式的应用。在这个例子中,老板通过一个管理层面(外观类)来下达命令,而具体的执行细节由各个员工(子系统)来完成。

角色定义

外观类(Facade):管理层面,提供简化的方法供老板调用。

class ManagementFacade {
    private EmployeeA employeeA;
    private EmployeeB employeeB;
    private EmployeeC employeeC;

    public ManagementFacade() {
        this.employeeA = new EmployeeA();
        this.employeeB = new EmployeeB();
        this.employeeC = new EmployeeC();
    }

    public void completeProject() {
        System.out.println("管理层面:开始项目");
        employeeA.doTaskA();
        employeeB.doTaskB();
        employeeC.doTaskC();
        System.out.println("管理层面:项目完成");
    }
}

子系统类(Subsystems):各个员工,具体执行任务。

// 员工A
class EmployeeA {
    public void doTaskA() {
        System.out.println("员工A执行任务A");
    }
}

// 员工B
class EmployeeB {
    public void doTaskB() {
        System.out.println("员工B执行任务B");
    }
}

// 员工C
class EmployeeC {
    public void doTaskC() {
        System.out.println("员工C执行任务C");
    }
}

客户端(Client):老板,通过外观类下达命令。

public class FacadePatternDemo {
    public static void main(String[] args) {
        ManagementFacade management = new ManagementFacade();
        management.completeProject();
    }
}


http://www.kler.cn/a/507332.html

相关文章:

  • 【物联网】ARM核介绍
  • 深度学习电影推荐-CNN算法
  • 【Linux】11.Linux基础开发工具使用(4)
  • Deep4SNet: deep learning for fake speech classification
  • Python文件操作中编码解码问题
  • WORD转PDF脚本文件
  • 速通Docker === 常用命令
  • 【PCIe 总线及设备入门学习专栏 5.3.3 -- PCIe 掩图 mask 介绍】
  • 【鱼皮大佬API开放平台项目】Spring Cloud Gateway HTTPS 配置问题解决方案总结
  • SM3在线哈希运行
  • 【PPTist】幻灯片放映
  • Kubernetes 部署 RabbitMQ 集群教程
  • MATLAB 2025a更新了些什么?
  • sparkRDD教程之基本命令
  • 【设计模式-结构型】享元模式
  • ‌OCP英文全称是什么
  • ElementTree 库该怎么学习?
  • 华为EulerOS 学习,是否要先 RHCE?
  • Apache NiFi存在信息泄露漏洞(CVE-2024-56512)
  • Elasticsearch二次开发:实现实时定时同步同义词、近义词与停用词
  • Elasticsearch的function_score与rescore的区别
  • npm 方式安装Pyodide 详解
  • 小模型干大事情,基于LLaMA-Factory+Lora入门级微调开源AI模型
  • Windows远程桌面网关出现重大漏洞
  • redisson 连接 redis5报错 ERR wrong number of arguments for ‘auth‘ command
  • Android Studio:Linux环境下安装与配置