文章参考于《设计模式的艺术之道》——刘伟
定义:外部与一个子系统的通信通过一个统一的外观角色进行。就相当于是你想上网,走去网吧,你不需要自带鼠标键盘,和网线,主机等,你只要交钱就可以享受上网啦,至于组装其他的不需要你管。
所以,外部模式就相当于是一个服务类,整合了你想要的东西,方便你的调用,而不需要一个一个的去调用,减低用户的使用成本。
Facade : 客户调用的外观类,它知道子系统的功能和责任,将客户请求委派到相应的子系统,让子系统对象处理。
SubSystem : 子系统,实现外观类指派的任务。注意,外观角色对于子系统来说,知识另外一个客户端,子系统中没有外观类的引用。
简单代码样例
//客户端,直接调用外观类,而不需要调用整个变身过程的所有函数。
class Main{
public static void main(String[] args){
ShapeShift xmx = new ShapeShift();
xmx.transform();
}
}
//外观类
class ShapeShift{
private Music music;
private Dance dance;
private Cloth cloth;
//巴啦啦小魔仙变身
public ShapeShift(){
music = new Music(); //音乐起
dance = new Dance(); //跳舞
cloth = new Cloth(); //变装
}
public void transform(){
music.musicUp();
dance.dance();
cloth.changeCloth();
}
}
class Music {
public void musicUp() {
System.out.println("背景音乐起");
}
}
class Dance {
public void dance(){
System.out.println("跳舞...");
}
}
class Cloth {
public void changeCloth(){
System.out.println("换装");
}
}
适用场景
1、构建有层次结构的子系统,用外观类来为每个子系统提供每一层的入口,层之间不联系,通过外观类通信,减少子系统之间的依懒性。
2、客户端和多个子系统存在很大的依赖性,引入外观类将客户端与子系统解耦。
3、为一系列的复杂的子系统提供简单的入口时。
注意:子系统可以是一个类,一个功能模块,一个完整的小系统