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

时间:2024-04-26 07:12:21

外观模式(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();
    }
}