外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一系统更加容易使用。
一、外观模式
外观模式(Facade)属于结构型设计模式,它隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。其UML图如下:
外观模式由下面模式组成:
外观角色(Facade):是模式的核心,被客户client角色调用,知道各个子系统的功能。同时根据客户角色已有的需求,预订功能组合。
子系统角色(Subsystem classes):实现子系统的功能,处理Facade对象指派的任务。对子系统而言,没有Facade的任何相关信息,没有指向Facade的实例。
二、案例分析
在《西游记》中,降雨这事,皆是天机,可谓“天机不可泄露”,降雨是要天上雨部、雷部、云部、风部四部合力,才能普降甘雨,救济黎民。在第四十五回《三清观大圣留名 车迟国猴王显法》中,孙悟空和虎力大仙斗法求雨,描述如下:
那大仙走进去,更不谦逊,直上高台立定。旁边有个小道士,捧了几张黄纸书就的符字,一口宝剑,递与大仙。大仙执着宝剑,念声咒语,将一道符在烛上烧了。那底下两三个道士,拿过一个执符的象生,一道文书,亦点火焚之。那上面乒的一声令牌响,只见那半空里,悠悠的风色飘来….
……
天君道:“那道士五雷法是个真的。他发了文书,烧了文檄,惊动玉帝,玉帝掷下旨意,径至九天应元雷声普化天尊府下。我等奉旨前来,助雷电下雨。”
这样看来,虎力大仙根本不知道降雨的流程。他只是发了文书,烧了文檄,就能求雨成功。这里就隐含着外观模式。我们把降雨的四个步骤,作为子系统中的类,完整的一次降雨过程,作为Facade的一个方法, 其UML图如下:
代码部分:
下雨的四个步骤:
SubSystemA–刮风
class SubSystemA{
public void wind(){
System.out.println("风婆扯开皮袋,巽二郎解放口绳,风来了");
}
}
SubSystemB–起雾
class SubSystemB{
public void cloud(){
System.out.println("推云童子,布雾郎君,云雾皆来");
}
}
SubSystemC–雷鸣
class SubSystemC{
public void laghtning(){
System.out.println("雷公奋怒,电母生嗔");
}
}
SubSystemC–下雨
class SubSystemD{
public void rain(){
System.out.println("龙施号令,雨漫乾坤");
}
}
Facade 类
class Facade{
SubSystemA one;
SubSystemB two;
SubSystemC three;
SubSystemD four;
pubiic Facade(){
private SubSystemA one = new SubSystemA();
private SubSystemB two= new SubSystemB();
private SubSystemC three= new SubSystemC();
private SubSystemD four = new SubSystemD();
public void rainPrecess(){
System.out.println("有人求雨啦!");
one.wind();
two.cloud();
three.laghtning();
four.rain();
}
}
故事上演:
public class Story{
public static void main(String[] args) {
Facade facade = new Facade ();
facade.rainPrecess();
}
}
运行结果:
代码地址:Facade
一次降雨过程就结束了,无论是虎力大仙,还是孙悟空,都不需要关心降雨的详细过程,只需要“求雨”即可。
综上,就是一个简单的外观模式。
欢迎大家留言评论,点击查看更多设计模式。