结构型模式-外观模式

devtools/2024/11/29 17:28:51/

外观模式(Facade Pattern)是一种结构型设计模式,用于为复杂子系统提供一个统一的、高层次的接口。通过外观模式,客户端无需深入了解子系统的内部复杂性,只需与外观类交互即可完成任务,从而简化了使用方式,降低了耦合性。

核心思想

简化接口:通过一个“外观类”(Facade),封装子系统的复杂接口,提供简洁易用的接口。
解耦合:外观类将客户端与子系统分离,使得客户端无需直接操作子系统,从而降低了耦合度。
对子系统透明:外观模式并不限制子系统的直接使用,客户端仍可根据需要访问子系统的原始功能。

结构

  • Facade(外观类):对外提供简单的接口,隐藏子系统的复杂性。
  • Subsystem Classes(子系统类):实现子系统的核心功能,外观类通过调用它们的方法来实现功能。
  • Client(客户端):使用外观类提供的接口与子系统交互。

Java实现示例

java">//子系统类
public class SubsystemA {public void operationA() {System.out.println("子系统A的操作");}
}public class SubsystemB {public void operationB() {System.out.println("子系统B的操作");}
}public class SubsystemC {public void operationC() {System.out.println("子系统C的操作");}
}
//外观类
public class Facade {private SubsystemA subsystemA;private SubsystemB subsystemB;private SubsystemC subsystemC;public Facade() {subsystemA = new SubsystemA();subsystemB = new SubsystemB();subsystemC = new SubsystemC();}public void method1() {System.out.println("方法1:整合子系统A和B的功能");subsystemA.operationA();subsystemB.operationB();}public void method2() {System.out.println("方法2:整合子系统B和C的功能");subsystemB.operationB();subsystemC.operationC();}
}
//客户端代码
public class Main {public static void main(String[] args) {Facade facade = new Facade();// 调用外观类的方法facade.method1();facade.method2();}
}

适用场景

  • 简化客户端操作:客户端需要与多个子系统交互,而这些子系统接口复杂。
  • 需要分层解耦:外观类可以作为中间层,解耦客户端和底层子系统。
  • 子系统的重构或扩展:当子系统发生变化时,只需要调整外观类,而无需修改客户端代码。

优缺点

  • 优点:
    • 简化接口:为复杂子系统提供了一个简单接口。
    • 降低耦合:客户端与子系统通过外观类进行交互,减少直接依赖。
    • 更好地分层:通过外观类组织子系统,增强系统的可维护性。
  • 缺点:
    • 可能引入过多的外观类:如果不是设计得当,外观类可能过于复杂,反而违背简化的初衷。
    • 不符合开放/封闭原则:外观类一旦定义,要扩展功能需要修改原有代码。
    • 外观模式常用于构建大型系统,比如数据库访问、文件操作、网络请求等,通过外观模式屏蔽底层的复杂性,提升开发效率和可维护性。

http://www.ppmy.cn/devtools/137977.html

相关文章

神经网络中的损失函数(Loss Function)

损失函数(Loss Function)在机器学习和深度学习中扮演着至关重要的角色,它是衡量模型预测值与实际值之间差异程度的函数。通过最小化损失函数,我们可以优化模型的参数,使其预测结果更加准确。 一、损失函数的定义 损失函…

QT QFormLayout控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…

Flutter:启动屏逻辑处理02:启动页

启动屏启动之后&#xff0c;制作一个启动页面 新建splash&#xff1a;view 视图中只有一张图片sliding.png就是我们的启动图 import package:flutter/material.dart; import package:get/get.dart; import index.dart; class SplashPage extends GetView<SplashController…

Python入门(18)--实战项目

机器学习实战项目指南 &#x1f916; 项目概览 &#x1f310; 本项目是一个综合性的机器学习入门实战指南&#xff0c;通过实际案例展示机器学习项目的完整生命周期&#xff0c;包括数据处理、模型训练、评估和部署等关键环节。 1. 系统架构 &#x1f3d7;️ 1.1 核心组件 …

设计模式学习之——责任链模式

责任链模式的基本概念 定义&#xff1a;责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许多个对象按照一定顺序处理请求&#xff0c;并且每个对象可以选择自己是否处理该请求或者将其传递给下一个对象处理。 核心思…

Spring数据接收揭秘

RequestMapping RequestMapping是Spring框架中用于将HTTP请求映射到控制器的处理方法上的注解&#xff0c;它能将特定的HTTP请求与控制器中的方法进行关联&#xff0c;使开发者可以根据请求的路径、请求方法、请求头、请求参数等条件&#xff0c;来确定由哪个方法处理该请求&a…

利用Vue 3实现鼠标跟随效果案例

在Web开发领域&#xff0c;鼠标跟随效果是一种能显著提升页面交互性、增加动态感与趣味性的常见方式。接下来&#xff0c;我们将通过一个详细的案例&#xff0c;深入讲解如何运用Vue 3来打造一个更为完善的鼠标跟随效果组件&#xff0c;重点在于优化鼠标移动逻辑部分。 一、案…

如何在CodeIgniter中加载视图

在CodeIgniter中加载视图&#xff08;view&#xff09;是开发Web应用程序中的一个基本步骤。CodeIgniter的视图机制允许你将HTML与PHP代码分离&#xff0c;从而提高代码的可维护性和可读性。以下是如何在CodeIgniter中加载视图的基本步骤&#xff1a; 1. 创建一个控制器 首先…