外观模式的介绍
外观模式,他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于机构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。
外观模式定义
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个共层次的接口,使得子系统更易于使用。
外观模式的使用场景
1.为一个复杂子系统提供一个简单接口。子系统往往因为不断演化而变得越来越复杂,甚至可能被替换。大多数模式使用时都会产生更多、更小的类,在这使子系统更具可重用性的同时也更容易对子系统进行定制、修改,这种易变性使得隐藏子系统的具体实现变得尤为重要。Facade可以提供一个简单统一的接口,对外隐藏子系统的具体实现、隔离变化
2.当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过Facade接口进行通信,从而简化了它们之间的依赖关系。
外观模式的UML类图
实例
//cpu子系统
public class CPU {
public void start(){
System.out.println("cup is start...");
}
public void shutDown(){
System.out.println("cup is shutdown...");
}
}
//disk子系统
public class Disk {
public void start(){
System.out.println("disk is start...");
}
public void shutDown(){
System.out.println("disk is shutdown...");
}
}
//Memory子系统类
public class Memory {
public void start(){
System.out.println("memory is start...");
}
public void shutDown(){
System.out.println("memory is shutdown...");
}
}
//门面类
public class Computer {
private CPU cpu;
private Memory memory;
private Disk disk;
public Computer(){
cpu = new CPU();
memory = new Memory();
disk = new Disk();
}
public void start(){
cpu.start();
disk.start();
memory.start();
}
public void shutDown(){
cpu.shutDown();
disk.shutDown();
memory.shutDown();
}
}
//客户端
public class Client {
public static void main(String[] args) {
Computer computer = new Computer();
computer.start();
System.out.println("\==============");
computer.shutDown();
}
}
cup is start…
disk is start…
memory is start…
\==============
cup is shutdown…
disk is shutdown…
memory is shutdown…
从上面的实例来看,有了这个Facade类,也就是Computer类,用户就不用亲自去调用子系统中的Disk,Memory,Cpu类了,不需要知道系统内部的实现细节,甚至不用知道系统内部的构成。客户端只需要跟Facade交互就可以。
优点
松散耦合:使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护
简单易用:客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。
更好的划分访问层次:有些方法是对系统外的,有些方法是系统内部相互交互的使用。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统的内部细节