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