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


    外观模式(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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
  • 相关阅读:
    openEuler 22.03 x86架构下docker运行arm等架构的容器——筑梦之路
    OK3568 UBUNTU 安装使用I2C-TOOLS
    从零开始配置vim(21)——会话管理
    【线性代数】四、二次型
    室友打了一晚上游戏我学会了使用GDB调试
    1.4 计算机网络在我国的发展
    渗透测试过程中的JS调试(一)
    Python的第三方日志库Loguru
    Datawhale 202208 GitModel | 线性规划 下
    dll文件缺失,ps,pr无法打开,游戏运行不了如何解决
  • 原文地址:https://blog.csdn.net/csy08845/article/details/138163688