Java23种设计模式-结构型模式之外观模式

ops/2024/10/19 5:28:55/

外观模式(Facade Pattern):为复杂的系统提供了一个简单的统一接口,使得系统更易于使用和理解(对外提供一个统一的方法,来访问子系统中的一群接口

外观模式三个核心角色:
角色1.外观(Facade):外观类提供了一个简化的接口,封装了系统的复杂性。
角色2.子系统(Subsystem):子系统由多个相互关联的类组成,负责系统的具体功能。
角色3.客户端(Client):客户端则使用外观对象来与系统交互,而不需要了解系统内部的具体实现

优点:
1.简化接口:隐藏了系统的复杂细节,提供了一个简单的、高层的接口。
2.提高易用性:使得系统更容易被使用和理解。
3.降低耦合性:减少了系统各部分之间的依赖和耦合。
4.更好的可维护性:便于系统的维护和扩展。

缺点:
1.不符合开闭原则:在某些情况下,对系统的修改可能需要修改外观类,这违反了开闭原则。
2.灵活性受限:外观类的设计可能会限制系统的灵活性。
3.可能增加复杂度:如果外观类过于复杂,可能会增加系统的整体复杂度。
4.依赖性:客户端可能会过度依赖外观类,导致代码难以移植和维护。
5.性能影响:通过外观类进行交互可能会引入一定的性能开销。
6.代码可读性降低:过于复杂的外观类可能会降低代码的可读性。

应用场景
1.复杂的子系统集成。
2.提供一个统一的接口来访问多个不同的系统或模块。
3.简化复杂的系统,使其更易于使用和管理。

示例
ComputerFacade类作为外观类,它封装了对CPU、Memory和HardDrive类的操作,客户端只需要与ComputerFacade类交互,从而简化了客户端Demo的代码

//定义子系统接口和类
public class CPU {public void freeze(){System.out.println("CPU freeze");}public void jump(long position){System.out.println("CPU jump to position"+position);}public void execute(){System.out.println("CPU execute.");}
}
public class Memory {public void load(long position,byte[] data){System.out.println("Memory load from position"+position);}
}
public class HardDrive {public byte[] read(long lba,int size){System.out.println("Hard drive read lba"+lba+"size"+size);return new byte[0];}
}
//创建外观类
public class ComputerFacade {private static final long BOOT_ADDRESS = 0x0000fff0L;private static final long BOOT_SECTOR = 0x00007C00L;private static final int SECTOR_SIZE = 512;private CPU cpu;private Memory memory;private HardDrive hardDrive;public ComputerFacade() {this.cpu = new CPU();this.memory = new Memory();this.hardDrive = new HardDrive();}public void start(){cpu.freeze();memory.load(BOOT_ADDRESS,hardDrive.read(BOOT_SECTOR,SECTOR_SIZE));cpu.jump(BOOT_ADDRESS);cpu.execute();}
}
//Demo
public class FacadePatternDemo {public static void main(String[] args) {ComputerFacade computer = new ComputerFacade();computer.start();}
}

http://www.ppmy.cn/ops/15756.html

相关文章

按照模板导出复杂样式的excel

导出excel通常使用的是apache poi,但是poi的api相当复杂,所以当导出的excel样式比较复杂时,写起来就比较头疼了,这里推荐使用easypoi, 可以很方便的根据模板来导出复杂excel 文档地址: 1.1 介绍 - Powered by MinDoc 我们要实现如图所示效果…

Springboot整合mybatis

Springboot整合mybatis 总结步骤&#xff1a; 1&#xff0c;导入依赖 2&#xff0c;配置文件 3&#xff0c;编写配置类-配置分页 4&#xff0c;启动类上加注解扫描mapper 1&#xff0c;导入依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><…

东北大学工程训练CNC加工中心(坤图)

东北大学加工中心&#xff08;CNC&#xff09;采用的系统为FANUC系统。 要求学生自主设计图样&#xff0c;编写GCODE文件&#xff0c;操作电脑使机床按设计路径铣出图案。 本人设计的图样为坤坤图 图为用CAD设计绘制的图样。 计算坐标&#xff0c;设计铣刀轨迹&#xff0c;得…

vue 如何调用子组件内的方法

在Vue中&#xff0c;子组件的方法可以通过父组件的该子组件的引用来调用。 在父组件中&#xff0c;给子组件添加一个ref属性&#xff0c;用来获取子组件的引用。例如&#xff1a; <template><div><child-component ref"child"></child-compon…

基于Qt的二维码生成与识别

基于Qt的二维码生成与识别 一、获取QZxing开源库 1.通过封装的QZxing开源库生成和识别二维码&#xff0c;下载地址&#xff1a;GitCode - 开发者的代码家园https://gitcode.com/mirrors/ftylitak/qzxing/tree/master。 2.下载解压后&#xff0c;使用Qt Creator xx&#xff0…

MySQL锁详解

之前的博客给小伙伴们分享了java中的锁&#xff0c;今天我们一起来看看mysql中有什么锁吧 一、图示 二、粒度分类 2.1、全局锁&#xff1a; 什么是全局锁&#xff1f; MySQL的锁定主要分为全局锁、表锁和行锁。现在我们来看看MySQL全局锁。 MySQL全局锁是针对整个数据库的锁…

API网关:微服务架构的关键组件

在构建微服务架构时&#xff0c;API网关是不可或缺的一个核心组件。它不仅简化了客户端与后端服务的交互&#xff0c;还优化了数据处理、服务聚合、流量管理等多个关键方面。本文将探讨API网关的概念、功能以及它在微服务架构中的重要作用。 什么是API网关&#xff1f; API网…

.NET高级面试指南专题二十五【 建造者模式介绍,将复杂对象的构建过程与其表示分离】

建造者模式是一种创建型设计模式&#xff0c;用于将复杂对象的构建过程与其表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。它允许客户端通过指定要构建的类型和可选参数来构建对象&#xff0c;而不需要了解对象的具体构建细节。 优点&#xff1a; 将构建过程封装…