设计模式之外观模式

外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一系统更加容易使用。

一、外观模式

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

一次降雨过程就结束了,无论是虎力大仙,还是孙悟空,都不需要关心降雨的详细过程,只需要“求雨”即可。

综上,就是一个简单的外观模式。

欢迎大家留言评论,点击查看更多设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值