网站推广的策略方法网站建站思路
2026/2/22 3:05:14 网站建设 项目流程
网站推广的策略方法,网站建站思路,科技官网,英德市城乡建设局网站文章目录0.个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例4. 优缺点4.1 优点4.2 缺点5. 源码分析#xff08;MyBatis Configuration为例#xff09;0.个人感悟 外观模式旨在承上启下#xff0c;对客户端提供一个…文章目录0.个人感悟1. 概念2. 适配场景2.1 适合的场景2.2 常见场景举例3. 实现方法3.1 实现思路3.2 UML类图3.3 代码示例4. 优缺点4.1 优点4.2 缺点5. 源码分析MyBatis Configuration为例0.个人感悟外观模式旨在承上启下对客户端提供一个统一接口只定义需要关注的操作对下统筹各个子系统的操作外观模式很能体现出解耦的一个手段:分层外观模式有利于理解迪米特法则(最小知道原则)外观(门面)可以类比web编程中controller都是对外提供统一的接口对内整合自己的业务1. 概念英文定义(《设计模式可复用面向对象软件的基础》)Provide a unified interface to a set of interfaces in a subsystem. Facade defines a higher-level interface that makes the subsystem easier to use.中文翻译为子系统中的一组接口提供一个统一的接口。外观模式定义了一个高层接口使得子系统更容易使用。理解外观模式是一种结构型设计模式它为复杂的子系统提供一个简单易用的接口通过引入一个外观类Facade将客户端与子系统的复杂交互封装起来外观模式不改变子系统功能只是提供了一个更易于访问的入口点实现了客户端与子系统之间的解耦使子系统更容易维护和扩展外观模式符合迪米特法则最少知识原则客户端只需要与外观类交互2. 适配场景2.1 适合的场景需要简化复杂子系统接口时为子系统提供一个统一的入口客户端与多个子系统之间存在大量依赖关系希望降低耦合度需要将子系统分层为每一层提供统一的接口系统需要逐步重构可以先引入外观模式然后逐步迁移到新系统2.2 常见场景举例电脑启动过程用户只需按下电源键无需了解BIOS、CPU、内存等组件的复杂交互数据库连接JDBC驱动管理器封装了不同数据库的连接细节Web服务接口REST API网关整合多个微服务的调用日志框架SLF4J作为Logback、Log4j等日志实现的外观支付系统支付网关整合支付宝、微信支付、银联等不同支付渠道3. 实现方法3.1 实现思路识别复杂子系统分析系统中的各个组件和它们之间的依赖关系定义外观接口确定需要为客户端提供的简化操作实现外观类创建外观类封装子系统的复杂调用逻辑客户端通过外观类访问客户端只与外观类交互不直接调用子系统可选抽象外观如果需要支持多个子系统变体可以引入抽象外观类3.2 UML类图角色说明Facade外观为子系统提供一个统一的接口知道哪些子系统负责处理请求Subsystem Classes子系统类实现子系统的功能处理外观对象指派的任务Client客户端通过外观接口与子系统交互不需要了解子系统的内部细节3.3 代码示例背景:电脑的启动重启过程涉及到很多子系统的操作但是机箱其实只提供了开机关机重启按钮这就是很典型的外观模式。简化掉bios等流程代码如下:各个子系统简化为CPU 内存 硬盘:// CPU子系统publicclassCPU{/** * description 冻结 * author bigHao * date 2026/1/12 **/publicvoidfreeze(){System.out.println(CPU冻结当前任务);}/** * param position 位置 * description 跳转 * author bigHao * date 2026/1/12 **/publicvoidjump(longposition){System.out.println(CPU跳转到内存位置: position);}/** * description 执行 * author bigHao * date 2026/1/12 **/publicvoidexecute(){System.out.println(CPU开始执行指令);}}// 内存子系统publicclassMemory{/** * param position 位置 * param data 字节数据 * description // TODO * author bigHao * date 2026/1/12 **/publicvoidload(longposition,byte[]data){System.out.println(内存加载数据到位置: position);}/** * description 释放 * author bigHao * date 2026/1/12 **/publicvoidshutdown(){System.out.println(内存释放);}}// 硬盘子系统publicclassHardDrive{/** * param lba 扇区 * param size 大小 * return byte[] * description 读取数据 * author bigHao * date 2026/1/12 **/publicbyte[]read(longlba,intsize){System.out.println(硬盘读取扇区 lba大小: size bytes);returnnewbyte[size];}/** * description 释放 * author bigHao * date 2026/1/12 **/publicvoidshutdown(){System.out.println(硬盘读释放);}}外观类类似于机箱这里也可以先定义接口再提供实现publicclassComputerFacade{// 启动内存地址常量privatestaticfinallongBOOT_ADDRESS0x7C00;privatestaticfinallongBOOT_SECTOR0;privatestaticfinalintSECTOR_SIZE512;privateCPUcpu;privateMemorymemory;privateHardDrivehardDrive;publicComputerFacade(){cpunewCPU();memorynewMemory();hardDrivenewHardDrive();}/** * description 启动 * author bigHao * date 2026/1/12 **/publicvoidstart(){System.out.println( 开始启动计算机 \n);// 硬盘加载数据byte[]bootSectorhardDrive.read(BOOT_SECTOR,SECTOR_SIZE);// 加载到内存memory.load(BOOT_ADDRESS,bootSector);// cpu运行cpu.freeze();cpu.jump(BOOT_ADDRESS);cpu.execute();}/** * description 关机 * author bigHao * date 2026/1/12 **/publicvoidshutdown(){System.out.println( 开始关闭计算机 \n);// cpu停止cpu.freeze();// 内存停止memory.shutdown();// 硬盘停止hardDrive.shutdown();}/** * description 重启 * author bigHao * date 2026/1/12 **/publicvoidrestart(){System.out.println( 开始重启计算机 \n);start();shutdown();}}测试:publicclassClient{staticvoidmain(){// 只用与门面交互ComputerFacadefacadenewComputerFacade();facade.start();facade.shutdown();facade.restart();}}输出 开始启动计算机 硬盘读取扇区 0大小: 512 bytes 内存加载数据到位置: 31744 CPU冻结当前任务 CPU跳转到内存位置: 31744 CPU开始执行指令 开始关闭计算机 CPU冻结当前任务 内存释放 硬盘读释放 开始重启计算机 开始启动计算机 硬盘读取扇区 0大小: 512 bytes 内存加载数据到位置: 31744 CPU冻结当前任务 CPU跳转到内存位置: 31744 CPU开始执行指令 开始关闭计算机 CPU冻结当前任务 内存释放 硬盘读释放4. 优缺点4.1 优点符合高内聚低耦合原则降低耦合度将客户端与复杂的子系统解耦客户端只依赖外观类提高内聚性外观类将相关的子系统操作封装在一起提高复用性外观类可以被多个客户端复用避免重复编写复杂的子系统调用代码增强可维护性子系统内部变化不会影响客户端只需要修改外观类便于分层和模块化管理提高可读性简化了客户端代码使其更加清晰易懂提供了清晰的系统边界和接口符合开闭原则可以扩展外观类来添加新功能而不需要修改现有代码4.2 缺点可能违反单一职责原则如果外观类过于庞大可能承担了太多职责性能开销额外的调用层可能带来轻微的性能损失灵活性受限对于需要访问子系统特定功能的客户端可能需要绕过外观类5. 源码分析MyBatis Configuration为例MyBatis中的Configuration类是外观模式的典型应用它封装了MyBatis框架的复杂配置和初始化过程。MyBatis Configuration类结构// Configuration类充当了MyBatis的外观类publicclassConfiguration{// 存储各种配置信息protectedEnvironmentenvironment;protectedTypeAliasRegistrytypeAliasRegistry;protectedTypeHandlerRegistrytypeHandlerRegistry;protectedMapperRegistrymapperRegistry;protectedMapString,MappedStatementmappedStatements;protectedMapString,Cachecaches;// 各种配置方法 - 对外提供简单接口publicvoidaddMappers(StringpackageName){mapperRegistry.addMappers(packageName);}publicTvoidaddMapper(ClassTtype){mapperRegistry.addMapper(type);}publicvoidaddMappedStatement(MappedStatementms){mappedStatements.put(ms.getId(),ms);}publicMappedStatementgetMappedStatement(Stringid){returnmappedStatements.get(id);}// 类型处理器相关方法publicvoidregisterTypeHandler(TypeHandler?typeHandler){typeHandlerRegistry.register(typeHandler);}publicTypeHandler?getTypeHandler(Class?javaType){returntypeHandlerRegistry.getTypeHandler(javaType);}}外观模式分析:外观角色Configuration类封装了MyBatis的所有配置信息提供了统一的方法来访问各个组件子系统角色XMLConfigBuilder解析XML配置文件MapperRegistry管理Mapper接口TypeHandlerRegistry管理类型处理器MappedStatement管理SQL映射语句客户端SqlSessionFactoryBuilder、DefaultSqlSessionFactory等设计优势简化使用用户只需要配置Configuration不需要了解内部复杂的解析和初始化过程解耦SqlSessionFactory只依赖Configuration外观类不直接依赖各个子系统可维护性配置逻辑的变化被封装在Configuration和相关子系统中灵活性可以通过扩展Configuration来支持不同的配置方式这种多层外观设计使得MyBatis具有很好的层次结构和模块化每个层次都封装了特定的复杂性为上层提供简单的接口。参考韩顺平 Java设计模式张维鹏 Java设计模式之结构型外观模式kosamino 设计模式之外观模式Facade详解及代码示例

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询