一  定义

为子系统中的一组接口提供一个一致的界面。Facade模式定义了一个高层的接口,这个接口使得这一子系统更加easy使用。

二  案例

一个子系统中拥有3个模块。每一个模块中都有3个方法。当中一个为client调用方法,其它两个则为各子模块间互相调用方法。此时有例如以下需求,client为完毕功能。须要组合3个模块中的方法才干实现功能。

三  未使用模式情况

/*** @Description A模块* @author jerry * @date 2016年4月11日下午2:16:04*/
public interface AModuleApi {public void a1();  //此方法主要用于外部调用public void a2();  //下面双方法主要用于子系统内部间调用public void a3();
}
/*** @Description A模块实现* @author jerry * @date 2016年4月11日下午2:17:10*/
public class AModuleImpl implements AModuleApi {@Overridepublic void a1() {System.out.println("调用了A模块");}@Overridepublic void a2() {//TODO 主要用于子模块间互相调用}@Overridepublic void a3() {//TODO 主要用于子模块间互相调用}
}
/*** @Description B模块* @author jerry * @date 2016年4月11日下午2:16:12*/
public interface BModuleApi {public void b1();  //此方法主要用于外部调用public void b2();  //下面双方法主要用于子系统内部间调用public void b3();
}
/*** @Description B模块实现* @author jerry * @date 2016年4月11日下午2:17:10*/
public class BModuleImpl implements BModuleApi {@Overridepublic void b1() {System.out.println("调用了B模块");}@Overridepublic void b2() {//TODO 主要用于子模块间互相调用}@Overridepublic void b3() {//TODO 主要用于子模块间互相调用}
}

同理。C模块也是如此,篇幅原因。这里不贴代码了,须要代码能够从我github下clone,文末会给出地址。

client调用例如以下:
public class Client {public static void main(String[] args) {AModuleApi a = new AModuleImpl();a.a1();BModuleApi b = new BModuleImpl();b.b1();CModuleApi c = new CModuleImpl();c.c1();}
}

相信非常easy能够写出这种代码。

细致想想能够发现,假设这样写。会存在例如以下问题:

  1. 代码耦合度太高,client与子系统中各模块都有关联。一旦子系统有什么更改,会涉及到client的改动。
  2. 对client学习成本太高。client须要学习各个模块中每一个public方法。知道其什么含义后才干进行调用。

四  使用模式的情况

我们能够在系统这端(即外观模式属于系统这端,若属于客户这端。仍然须要客户去了解每一个模块每一个方法意义,这样无不论什么意义。) 加入一个外观类,由外观类重组须要调用的方法,例如以下所看到的:
/*** @Description 外观类,通常设计成单例* @author jerry * @date 2016年4月11日下午2:43:26*/
public class Facade {private Facade(){}public static void test(){AModuleApi a = new AModuleImpl();a.a1();BModuleApi b = new BModuleImpl();b.b1();CModuleApi c = new CModuleImpl();c.c1();}
}
public class Client {public static void main(String[] args) {
//      AModuleApi a = new AModuleImpl();
//      a.a1();
//      BModuleApi b = new BModuleImpl();
//      b.b1();
//      CModuleApi c = new CModuleImpl();
//      c.c1();Facade.test();}
}

这样一来。client仅仅要与外观类打交道就可以,从而更好地实现了client和子系统各模块的耦合性。

使用外观的目的: 不是给子系统加入新的功能接口,而是让外部降低对子系统内部多个模块的直接交互。松散耦合,从而可以让外部更简单地使用子系统。

当然有时你会有这种需求,client可能仅仅须要调用两个模块就可以,那么现有的外观模式就无法使用了,仅仅好绕开外观类。直接找各模块进行调用。此外,你是否发现。我的ABC模块里面除了有供外部调用的方法外。还有各模块间互相调用的方法,这些方法本不须要client了解。暴露了过多内部细节。会让client产生疑惑,这就是“接口污染”  。要解决问题,我们能够将Facade类定义为接口,并对事实上现,使用工厂模式对其创建实例,例如以下所看到的:

public interface FacadeApi {public void a1();public void b1();public void c1();/*** @Description 原有方法,将各模块方法组合调用* @return void* @throws */public void test();
}
/*** @Description 外观接口实现* @author jerry * @date 2016年4月11日下午3:19:25*/
public class FacadeImpl implements FacadeApi {@Overridepublic void a1() {new AModuleImpl().a1();}@Overridepublic void b1() {new BModuleImpl().b1();}@Overridepublic void c1() {new CModuleImpl().c1();}@Overridepublic void test() {a1();b1();c1();}
}
/*** @Description 外观接口实现* @author jerry * @date 2016年4月11日下午3:19:25*/
public class FacadeImpl implements FacadeApi {@Overridepublic void a1() {new AModuleImpl().a1();}@Overridepublic void b1() {new BModuleImpl().b1();}@Overridepublic void c1() {new CModuleImpl().c1();}@Overridepublic void test() {a1();b1();c1();}
}
public class Client {public static void main(String[] args) {
//      AModuleApi a = new AModuleImpl();
//      a.a1();
//      BModuleApi b = new BModuleImpl();
//      b.b1();
//      CModuleApi c = new CModuleImpl();
//      c.c1();//       Facade.test();FacadeApi api = Factory.createFacade();api.test();}
}

这样以后,就对client降低了模块内部方法的暴露。

五  总结

外观模式的本质:封装交互。简化调用
何时使用外观模式:
  1. 假设你希望为一个复杂的子系统提供一个简单接口
  2. 假设构建多层结构的系统。能够考虑使用外观模式,使用外观对象作为每层的入口,这样能够简化层间调用,能够减少耦合度。
------------------------------------------------------------------------------------------------------------------------------------------
Github:  https://github.com/jerry-sc/designPattern
Reference:《研磨设计模式》

转载于:https://www.cnblogs.com/yangykaifa/p/7290448.html

【JAVA设计模式】外观模式(Facade Pattern)相关推荐

  1. 如何让孩子爱上设计模式 ——11.外观模式(Facade Pattern)

    如何让孩子爱上设计模式 --11.外观模式(Facade Pattern) 标签: 设计模式初涉 场景引入 相信各位玩过LOL英雄联盟游戏的童鞋,对下面两个英雄都不会陌生吧:       分别是瑞雯和 ...

  2. 设计模式 -结构型模式_门面模式(外观模式) Facade Pattern 在开源软件中的应用

    文章目录 Pre 定义 案例 Demo V1.0 Boss直接管理 V2.0 引入外观类 PmManagerFacade 何时使用Facade Tomcat Mybatis Pre 我们先来回顾下门面 ...

  3. 使用C#实现适配器模式 (Adapter Pattern) 和外观模式 (Facade Pattern)

    本文的概念内容来自深入浅出设计模式一书 现实世界中的适配器(模式) 我带着一个国标插头的笔记本电脑, 来到欧洲, 想插入到欧洲标准的墙壁插座里面, 就需要用中间这个电源适配器. 面向对象的适配器 你有 ...

  4. 设计模式:外观模式(Facade)

    外观模式(Facade)也叫过程模式, 外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式通过定义一个一致的接口,用以屏蔽内部子系 ...

  5. Java设计模式——外观模式【Facade Pattern】

    一.引言 23种设计模式大概分为三大类: 5种(创建型模式):工厂方法模式.抽象工厂模式.单例模式.原型模式.建造者模式. 7种(结构型模式):适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组 ...

  6. 设计模式(八): 从“小弟”中来类比外观模式(Facade Pattern)

    在此先容我拿"小弟"这个词来扯一下淡.什么是小弟呢,所谓小弟就是可以帮你做一些琐碎的事情,在此我们就拿"小弟"来类比"外观模式".在上面一篇 ...

  7. Java设计模式-外观模式(Facade)

    外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口 ...

  8. Java设计模式--外观模式

    1 Facade Pattern 外观模式 目的:隐藏系统的复杂性,并对外提供了一个可以访问的接口,不必关心实现的细节: 实现:在客户端和复杂系统之间再加一层,这一层将调用顺序.依赖关系等处理好. 1 ...

  9. Java 设计模式——外观模式

    概述 今天要说的外观模式是一个相对简单的设计模式,而且在日常的开发中,可能你也会时常使用它,只是你可能并未想过这是一个设计模式.本文会从一些实例着手,来对本文要说明的外观模式进行尽可能全面的讲解.希望 ...

  10. Java设计模式---外观模式

    外观模式(Facade) 外观模式的意图是:为子系统提供一个接口,便于它的使用. 解释: 简单的说,外观模式就是封装多个上层应用需要的方法,使得上层调用变得简单,为上层提供简单的接口,是设计模式中一种 ...

最新文章

  1. 关于使用android系统设备充当web服务器的一点准备
  2. Android开发--详解SAX解析XML文件
  3. 【OpenCV3】OpenCV3.2.0在VS2013环境下Cmake编译与快速配置
  4. 3.3.1 差错控制(检错编码)
  5. python服务端多进程压测工具
  6. 中国大数据企业排行榜V6.0- 5 年后再去看看中几个大数据公司的发展状况
  7. 打包 压缩 命令tar zip
  8. linux编译lnx文件命令_Linux常用命令手册
  9. DataFountain新上计算机视觉比赛-20万巨奖数钢筋
  10. 抽取JDBC工具类:JDBCUtils
  11. SQL72 考试分数(一)
  12. 【PHP基础】文件操作
  13. android极光推送被杀,关于APP进程被杀死,极光推送收不到消息的解决办法
  14. 你知道视频去水印的方法有哪些吗?分享2个实用的去水印方法
  15. 中龙电力什么理财产品预期收益高又安全?介绍四类理财产品
  16. 使用docker搭建个人博客
  17. python 比较好的社区
  18. Audified U73b 复古压缩器评测:带来复古温暖的色彩
  19. 目标检测~FastPillars实时3D
  20. Diagram Designer

热门文章

  1. 解决HTML embed标签显示在div上层(not z-index)
  2. TESTb需要向至少十几家应用商店提交上线审核,且每个应用商店要求的资料可能都不一样,异常繁琐
  3. OOo-MySpell 一个C++的拼写语法检查开源项目
  4. python获取屏幕文字_详解:四种方法教你对Python获取屏幕截图(PyQt , pyautogui)...
  5. 内存泄漏java例子_一次线上Java应用内存泄漏分析实例
  6. linux系统每月定时重启,linux系统定时重启.doc
  7. python实现多表格合并_用python实现多个表格合并按字段去重
  8. com口驱动_Ubuntu 安装Nvidia显卡驱动指南
  9. java 字符串是对象吗_解析Java中的String对象的数据类型
  10. python中dump函数_python中实现php的var_dump函数功能