一、了解外观模式

1.1 什么是外观模式

外观模式 (Facade Pattern) 提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

想要使用外观模式,我们需要创建一个接口来简化和统一包装一个子系统的一个或多个类。外观模式允许我们让客户和子系统之间避免紧耦合。

1.2 外观模式的组成结构

  • 客户 (Client):通过调用 Facede 来完成要实现的功能。
  • 外观 (Facade):外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。
  • 复杂的子系统:实现了子系统的功能。它对客户角色和 Facade 是未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。

1.3 外观模式 UML 图解

1.4 外观模式适用场景

  • 设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。
  • 开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。
  • 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。

二、外观模式具体应用

2.1 问题描述

看电影:大部分人应该都喜欢看电影,我们来想一下我们去电影院看电影,从坐下座位后都是需要哪些步骤。首先在电影没有正式放映之前会先放一会儿广告;然后将灯光调暗;接着后台播放器播放对应的 DVD,电影正式播放;当电影播放完毕后就是将灯光调回明亮;关闭播放器。

2.2 伪代码模拟过程

    ads.on();           // 电影未开始之前,放映一会儿广告ads.close();        // 电影快开始时,关闭广告light.dim(10);      // 将灯光的亮度调到 10%dvdPlayer.on(dvd);  // 播放器播放对应的 DVDlight.dim(100);     // 电影结束后,将灯光亮度调到 100%dvdPlayer.close();  // 关闭播放器

上面这种方式,用代码模拟电影院的步骤变得很复杂。我们可以使用外观模式,把这些复杂的步骤封装起来,只对外提供简单的方法。

2.3 外观模式设计图

2.4 外观模式代码实现

子系统广告 Advertisement 类

package com.jas.facade;public class Advertisement {void on(){System.out.println("现在开始播放广告,电影即将开始播放!");}void close(){System.out.println("广告播放结束!");}
}

子系统灯光 Light 类

package com.jas.facade;public class Light {void dim(int brightness){System.out.println("调整灯光亮度为:" + brightness + "%!");}
}

子系统播放器 DVDPlayer 类

package com.jas.facade;public class DVDPlayer {void on(String dvd){System.out.println("现在开始播放电影,观看的电影是" + dvd + "!");}void close(){System.out.println("电影播放结束,请大家按秩序退场,关闭播放器!");}
}

外观 TheaterFacade 类

package com.jas.facade;public class TheaterFacade {Advertisement ads;Light light;DVDPlayer dvdPlayer;public TheaterFacade(Advertisement ads, Light light, DVDPlayer dvdPlayer){this.ads = ads;this.light = light;this.dvdPlayer = dvdPlayer;}void watchMovie(String dvd){ads.on();ads.close();light.dim(10);dvdPlayer.on(dvd);}void endMovie(){light.dim(100);dvdPlayer.close();}
}

客户类

package com.jas.facade;public class TheaterTestDrive {public static void main(String[] args) {Advertisement ads = new Advertisement();Light light = new Light();DVDPlayer dvdPlayer = new DVDPlayer();TheaterFacade facade = new TheaterFacade(ads, light, dvdPlayer);facade.watchMovie("复仇者联盟×");facade.endMovie();}
}/*** 输出* 现在开始播放广告,电影即将开始播放!* 广告播放结束!* 调整灯光亮度为:10%!* 现在开始播放电影,观看的电影是复仇者联盟×!* 调整灯光亮度为:100%!* 电影播放结束,请大家按秩序退场,关闭播放器!*/

三、 外观模式总结

3.1 外观模式优点

  • 实现了子系统与客户端之间的松耦合关系。
  • 客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。

3.2 外观模式知识点总结

  • 当需要简化并统一一个很大的接口或者一个复杂的接口时,可以使用外观。
  • 外观将客户从一个复杂的子系统中解耦。
  • 实现一个外观,需要将子系统组合进外观中,然后具体的工作委托给子系统执行。

PS:点击了解更多设计模式 http://blog.csdn.net/codejas/article/details/79236013

参考文献

《Head First 设计模式》

Java 设计模式之外观模式相关推荐

  1. java设计模式之外观模式(门面模式)

    针对外观模式,在项目开发和实际运用中十分频繁,但是其极易理解,下面就简要介绍一下. 一.概念介绍 外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口.这种类型的设计 ...

  2. 【JAVA设计模式】外观模式(Facade Pattern)

    一  定义 为子系统中的一组接口提供一个一致的界面.Facade模式定义了一个高层的接口,这个接口使得这一子系统更加easy使用. 二  案例 一个子系统中拥有3个模块.每一个模块中都有3个方法.当中 ...

  3. (设计模式九)java设计模式之外观模式(门面模式)

    1.定义: 外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口 2.生活实例: 医院看病,首先病人必须先挂号,然后门诊.如果医生要求化验,病人必须首 ...

  4. Java设计模式之五 ----- 外观模式和装饰器模式

    前言 在上一篇中我们学习了结构型模式的适配器模式和桥接模式.本篇则来学习下结构型模式的外观模式和装饰器模式. 外观模式 简介 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这 ...

  5. java设计模式之——外观模式、组合模式、装饰模式、享元模式(结构型)

    一.外观模式 定义:为子系统中一组接口提供一致的界面,此模式定义了一个高层接口,该接口使得子系统更加容易使用. 使用场景:一.在软件设计初级阶段,应该有意识的将软件两个层分开,比如经典的三层架构,降低 ...

  6. java设计模式-- 观察者模式 , 外观模式, 模板方法模式

    观察者模式: 观察者模式比较容易理解: 比如天龙八部里面的王语嫣,每次慕容复打架的时候,每当别人将要使出什么绝招时,会提醒慕容复注意提防. 项目中用到的地方就是注册中中心,zookeeper,当Pro ...

  7. java设计模式 外观,精掌握Java设计模式之外观模式(10)

    定义 通俗地解释,当你打开灯的时候,你只需要嗯一下开关就好了,不需要关心灯泡亮起来的这个流程,同理,打开电脑的时候, 嗯一下开机键就好了,也不需要关心电脑是先运行cpu还是内核之类的.这样能让用户体验 ...

  8. Java设计模式之外观模式(门面模式,迪米特法则的具体实现,抽象外观类改进)

    一.概述 引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口.简而言之,外观模式就是定义了一个高层接口,这个接口可以使得这一子系统更加容易使用. 如果没有这个外观类, ...

  9. 【Java设计模式】外观模式

    ✍ 其实外观模式的动机可以用下面的图进行展示: 转换: 引入外观角色之后, 用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现 ,从而降低了系统的耦合度. 外观模式(Facade ...

最新文章

  1. python自动化测试xpath_Selenium自动化测试实例基于python
  2. luogu P1393 P3157 动态逆序对
  3. 中国的程序员们是否要声援微软小冰?
  4. Servlet 3.0 新特性详解
  5. 分布式理论CAP定理
  6. oracle 日志丢失,Oracle联机日志文件丢失解决方法一例
  7. zenmap扫描出来linux,如何在Linux上使用NMAP安全扫描器
  8. 目标检测第8步:如何在Windows10系统下,训练YOLOv5 5.0自定义数据集?(本地)
  9. XShell远程连接LInux服务器(地址端口映射方法)
  10. 《关键对话——注意观察,如何判断对话氛围是否安全》读书笔记(四)
  11. Vue笔记-Ant Design Vue构建前端连接后端WebSocket
  12. 详解HelloWorldBasic实例
  13. Angular2快速入门-1.创建第一个app
  14. 浅谈mysqli连接方式与PDO连接方式
  15. [渝粤题库]西北工业大学刑法
  16. python实验报告代写_python 代写python作业、Directory代写python实验、python编程作业帮做 、代做python程序设计...
  17. explain ref_面试前一定要知道的MySQL命令【explain】
  18. 彩色图片在OpenCV里的表示方式
  19. 极客”一词,来自于美国俚语“geek”的音译,一般理解为性格古怪的人
  20. MakeFile入门详解

热门文章

  1. 微服务架构下的安全认证与鉴权
  2. Tomcat启动问题,启动是Tomcat8,结果却是Tomcat9
  3. 前端传数据到后台部分接收成功,部分接收失败
  4. 《数据库系统实训》实验报告——函数的应用
  5. Minimum Array
  6. II play with GG
  7. 【jetson nano】 aarch64安装pycharm pytorch cuda
  8. Hadoop 2.4.1+HBase 0.98.6.1 分布式安装
  9. SpringMVC-学习笔记03【SpringMVC常用注解】
  10. 【CentOS Linux 7】实验5【安装VScode,并用VScode编写HTML网页】