一、定义
外观模式(Facade Pattern):为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。
外观模式是迪米特法则的具体实现,通过引入一个新的外观角色可以降低原有系统的复杂度,同时降低客户类与子系统的耦合度。
二、外观模式结构图
外观模式包含两个角色:
(1)外观角色(Facade):为子系统提供一个共同的对外接口。知道哪些子系统负责处理请求,将客户端的请求分派给相应的子系统。
(2)子系统角色(SubSystem):处理Facade对象指派的任务,注意子系统中没有Facade的任何信息。
三、适用场景
-
设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
-
子系统相对独立。
-
开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
-
维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。
四、外观模式优缺点
(1)优点
- 松散耦合
外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。
- 简单易用
外观模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟外观类交互就可以了。
- 更好的划分访问层次
通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到外观中,这样既方便客户端使用,也很好地隐藏了内部的细节。
(2)缺点
- 不符合开闭原则。
五、举例
每个Computer都有CPU、Memory、Disk。在Computer开启和关闭的时候,相应的部件也会开启和关闭,所以,使用了该外观模式后,会使用户和部件之间解耦。
/**
* cpu子系统类
* @author yikexin
*
*/
public class CPU {
public void start(){
System.out.println("cpu is start...");
}
public void shutDown(){
System.out.println("CPU is shutDown...");
}
}
/**
* Disk子系统类
* @author yikexin
*
*/
public class Disk{
public void start(){
System.out.println("Disk is start...");
}
public void shutDown(){
System.out.println("Disk is shutDown...");
}
}
/**
* Memory子系统类
* @author yikexin
*
*/
public class Memory{
public void start(){
System.out.println("Memory is start...");
}
public void shutDown(){
System.out.println("Memory is shutDown...");
}
}
/**
* 门面类(核心)
* @author yikexin
*
*/
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(){
System.out.println("Computer start begin");
cpu.start();
disk.start();
memory.start();
System.out.println("Computer start end");
}
public void shutDown(){
System.out.println("Computer shutDown begin");
cpu.shutDown();
disk.shutDown();
memory.shutDown();
System.out.println("Computer shutDown end...");
}
}
/**
* 客户端类
* @author yikexin
*
*/
public class Cilent {
public static void main(String[] args) {
Computer computer = new Computer();
computer.start();
System.out.println("=================");
computer.shutDown();
}
}