11、外观模式(Facade Pattern)

1. 外观模式

1.1 简介

  Facade模式要求一个子系统的外部与其内部的通信必须通过一个统一的Facade对象进行。Facade模式提供一个高层次的接口,使得子系统更易于使用。

  从客户程序的角度来看,Facade模式不仅简化了整个组件系统的接口,同时对于组件内部与外部客户程序来说,从某种程度上也达到了一种“解耦”的效果——内部子系统的任何变化不会影响到Façade接口的变化。

  注意区分Façade模式、Adapter模式、Bridge模式与Decorator模式。Façade模式注重简化接口,Adapter模式注重转换接口,Bridge模式注重分离接口(抽象)与其实现,Decorator模式注重稳定接口的前提下为对象扩展功能。

Facade的两种形式:

  • 类内实现额外非接口定义方法的隐藏
  • 对一组接口方法封装为一个提供对外服务

1.2 方法隐藏示例

对外接口FacadeService:

public interface FacadeService {
    public void a();//这个方法是给外部调用的
}

实现类FacadeServiceImpl:

public class FacadeServiceImpl implements FacadeService {
    public void a() {
        System.out.println("这是给外部调用的");
    }

    public void b() {
        System.out.println("这是给内部调用的");
    }
}

  a是给外部调用用的,此时可以给外部调用。但是b是给内部调用的,我们不希望给外部调用,此时可以怎么做呢?两种方式,一种是调整b方法的访问权限为private;另一种即Facade模式。

** FacadeServiceImplForOut:**

public class FacadeServiceImplForOut implements FacadeService {
    private FacadeService facadeService;

    public FacadeServiceImplForOut(FacadeServiceImpl facadeService){
        this.facadeService=facadeService;
    }
    public void a() {
        facadeService.a();
    }
}

调用:

public class FacadeServiceMain {
    public static void main(String[] args) {
        FacadeServiceImpl facadeService = new FacadeServiceImpl();
        FacadeServiceImplForOut fout = new FacadeServiceImplForOut(facadeService);
        fout.a();
    }
}

  facade提供了一个供外部client调用的Facade层,由其组织调用真正的业务层,对于调用client来说,真正的业务层对他来说是透明的,这样做的好处是让调用层client和真正的业务层解耦,同时在Facade层也可以做更多的事情,比如上面的屏蔽client不该访问到的方法等等。

1.3 接口方法封装示例

  我们把一个很文件的文件,放在了第二抽屉里,而第二个抽屉的钥匙放在了第一个抽屉里,我们要想取出这个文件,需要打开第一个抽屉拿到钥匙,然后打开第二个抽屉取出文件。

抽屉1DrawerOne:

class DrawerOne {

    public void open(){
       System.out.println("第一个抽屉被打开了");
       getKey();
    }

    public void getKey(){
       System.out.println("得到第二个抽屉的钥匙");
    }
}

抽屉2 DrawerTwo:

class DrawerTwo{

    public void open(){
       System.out.println("第二个抽屉被打开了");
       getFile();
    }

    public void getFile(){
       System.out.println("得到这个重要文件");
    }
}

调用示例:

    public static void main(String []args){
       DrawerOne darwerOne=new DrawerOne();
       DrawerTwo darwerTwo=new DrawerTwo();
       darwerOne.open();
       darwerTwo.open();
    }

** DrawerFacade:**

class DrawerFacade{

    DrawerOne darwerOne=new DrawerOne();
    DrawerTwo darwerTwo=new DrawerTwo();

    public void open(){
       darwerOne.open();
       darwerTwo.open();
    }
}

Facade调用示例:

    public static void main(String []args){
       DrawerFacade drawer=new DrawerFacade();
       drawer.open();
    }

1.4 使用场景

Facade模式主要适用于以下几种情况:

  • 不需要使用一个复杂系统的所有功能,而且可以创建一个新的类,包含访问系统的所有规则。如果只需要使用系统的部分功能,那么你为新类所创建的API将比原系统的API简单的多。
  • 希望封装或者隐藏系统原系统。
  • 希望使用原系统的功能,而且还希望增加一些新的功能。
  • 编写新类的成本小于所有人学会使用或者未来维护原系统上所需的成本。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345