1.影院管理项目

组建一个家庭影院:
DVD 播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,其过程为:
直接用遥控器:统筹各设备开关
开爆米花机
放下屏幕
开投影仪
开音响
开 DVD,选 dvd
去拿爆米花
调暗灯光
播放
观影结束后,关闭各种设备

2. 传统方式解决影院管理

3. 传统方式解决影院管理问题分析

1) 在 ClientTest 的 main 方法中,创建各个子系统的对象,并直接去调用子系统(对象)相关方法,会造成调用过程
混乱,没有清晰的过程
2) 不利于在 ClientTest 中,去维护对子系统的操作
3) 解决思路:定义一个高层接口,给子系统中的一组接口提供一个一致的界面(比如在高层接口提供四个方法ready, play, pause, end ),用来访问子系统中的一群接口
4) 也就是说 就是通过定义一个一致的接口(界面类),用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节 => 外观模式

4. 外观模式基本介绍

基本介绍

1)外观模式(Facade),也叫“过程模式”:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

2)外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用者只需要跟这个接口发生调用,而无需关心这个子系统的内部细节。

5.外观模式原理类图

1)外观类(Facade):为调用者提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象

2)调用者(Client):外观接口的调用者

3) 子系统的集合:指模块或者子系统,处理Facade对象指派的任务,他是功能的实际提供者

6.外观模式应用实例

1)思路分析和图解

2)代码实现

package com.facade;public class Client {public static void main(String[] args) {// TODO Auto-generated method stub//这里直接调用。。 很麻烦HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();homeTheaterFacade.ready();homeTheaterFacade.play();homeTheaterFacade.end();}
}
package com.facade;public class DVDPlayer {//使用单例模式, 使用饿汉式private static DVDPlayer instance = new DVDPlayer();public static DVDPlayer getInstanc() {return instance;}public void on() {System.out.println(" dvd on ");}public void off() {System.out.println(" dvd off ");}public void play() {System.out.println(" dvd is playing ");}//....public void pause() {System.out.println(" dvd pause ..");}
}
package com.facade;public class Popcorn {private static Popcorn instance = new Popcorn();public static Popcorn getInstance() {return instance;}public void on() {System.out.println(" popcorn on ");}public void off() {System.out.println(" popcorn ff ");}public void pop() {System.out.println(" popcorn is poping  ");}
}
package com.facade;public class Projector {private static Projector instance = new Projector();public static Projector getInstance() {return instance;}public void on() {System.out.println(" Projector on ");}public void off() {System.out.println(" Projector ff ");}public void focus() {System.out.println(" Projector is Projector  ");}
}
package com.facade;public class Screen {private static Screen instance = new Screen();public static Screen getInstance() {return instance;}public void up() {System.out.println(" Screen up ");}public void down() {System.out.println(" Screen down ");}
}
package com.facade;public class Stereo {private static Stereo instance = new Stereo();public static Stereo getInstance() {return instance;}public void on() {System.out.println(" Stereo on ");}public void off() {System.out.println(" Screen off ");}public void up() {System.out.println(" Screen up.. ");}//...
}
package com.facade;public class TheaterLight {private static TheaterLight instance = new TheaterLight();public static TheaterLight getInstance() {return instance;}public void on() {System.out.println(" TheaterLight on ");}public void off() {System.out.println(" TheaterLight off ");}public void dim() {System.out.println(" TheaterLight dim.. ");}public void bright() {System.out.println(" TheaterLight bright.. ");}
}
package com.facade;public class HomeTheaterFacade {//定义各个子系统对象private TheaterLight theaterLight;private Popcorn popcorn;private Stereo stereo;private Projector projector;private Screen screen;private DVDPlayer dVDPlayer;//构造器public HomeTheaterFacade() {super();this.theaterLight = TheaterLight.getInstance();this.popcorn = Popcorn.getInstance();this.stereo = Stereo.getInstance();this.projector = Projector.getInstance();this.screen = Screen.getInstance();this.dVDPlayer = DVDPlayer.getInstanc();}//操作分成 4 步public void ready() {popcorn.on();popcorn.pop();screen.down();projector.on();stereo.on();dVDPlayer.on();theaterLight.dim();}public void play() {dVDPlayer.play();}public void pause() {dVDPlayer.pause();}public void end() {popcorn.off();theaterLight.bright();screen.up();projector.off();stereo.off();dVDPlayer.off();}}

7. 外观模式在mybatis框架应用的源码分析

1)mybatis中的Configuration去创建MetaObject对象使用到外观模式

2)代码分析+示意图

3)对源码中使用到的外观模式的角色类图

8. 外观模式的注意事项和细节

1)外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统的使用的复杂性

2)外观模式对客户端与子系统的耦合关系-解耦,让子系统的内部的模块更容易维护和拓展

3)通过合理的使用外观模式,可以帮助我们更好的使用Facade模式

4)当系统需要进行分层设计时,可以考虑使用facade模式。

5)在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade 类,来提供遗留系统的比较清晰简单的接口,让新系统与 Facade 类交互,提高复用性

6)不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好。要以让系统有层次,利于维护为目的。

day02 设计模式-外观模式相关推荐

  1. Python设计模式-外观模式

    Python设计模式-外观模式 代码基于3.5.2,代码如下; #coding:utf-8 # 外观模式class AlarmSensor:def run(self):print("Alar ...

  2. 设计模式--------外观模式

    设计模式--------外观模式 介绍外观模式的四大问题 现在的写法有什么问题吗? 为什么要用外观模式? 什么是外观模式? 外观模式有什么好处? 使用一个例子进行问题的说明 假如要制作一个智能系统,要 ...

  3. [设计模式]外观模式

    1. 定义 外观模式 提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更加容易使用. 外观不仅简化了系统内接口的使用,也将客户从组件中的子系统中解耦,外观和适配器都可 ...

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

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

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

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

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

    我又来了,继Java设计模式之桥接模式后,现在来到了外观模式啦,外观模式又称为门面模式啦

  7. 大话设计模式—外观模式

    外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性. 这种模式涉及 ...

  8. 设计模式 外观模式 一键电影模式

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/25837275 这个模式比较简单,嘿嘿,简单写一下. 老样子,先看 外观模式(Fa ...

  9. 8. 设计模式 外观模式 一键电影模式

    这个模式比较简单,嘿嘿,简单写一下. 老样子,先看 外观模式(Facade Pattern)定义:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用.其实就是 ...

最新文章

  1. php数组,常量,遍历等
  2. 饿了么口碑活跃用户增长近美团3倍,2020年行业竞争局势将扭转?
  3. Spherical Harmonics Lighting的代码实现(基于OpenGL)
  4. 力软 java主从表保存_JAVA常用知识总结(十二)——数据库(二)
  5. Python爬虫批量下载糗事百科段子,怀念的天王盖地虎,小鸡炖蘑菇...
  6. 持续集成及部署利器:Go
  7. D. Closest Equals(线段树)
  8. css如何让两个div上下排列_CSS层叠上下文
  9. SAP 是不是很烂的一个ERP软件
  10. Codebook model 视频抠像 xp sp3 + vs2005 + OpenCV 2.3.1
  11. 大数据实效_普洱市以“大数据”思维全面提升新时代干部管理监督实效
  12. Https如何做到通信安全
  13. restsharp text html,c# – 使用RestSharp发送HTTP POST Multipart / form-data字段
  14. 手机通过WiFi控制电脑
  15. 联想微型计算机如果进入BIos,联想怎么进入bios 【处理方法】
  16. 介绍2个免费图片视频素材网站
  17. 搭建jitsi的prosody出现的问题
  18. python运动目标检测_运动目标检测(3)—光流法
  19. 【论文笔记】Details or Artifacts: A Locally Discriminative Learning Approach toRealistic Image Super-Reso
  20. 设备管理器出现“未知USB设备”同时蓝牙不可用的解决方法

热门文章

  1. Davinci视频采集驱动文档
  2. 北京理工大学计算机保研面试,保研之旅2:北京理工大学雷达所面试
  3. 二、Spring Cloud 极简入门-Spring Cloud简介
  4. Java范例开发大全源程序
  5. 顺丰“牵手”唯品会,电商物流大战事的小缩影
  6. Baxter官网资料(查)
  7. Praat脚本文件教程之Scripting2.How to script setting windows
  8. 魔兽世界服务器同时在线人数,魔兽世界怀旧服国服同时在线人数达到60万,排队30万,即将破百万...
  9. ubuntu 部署ATX
  10. QQ浏览器可以处理pdf,ppt,word和excel文件您造吗?