引言

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

一、案例分析

生活中有很多类似的案例,比如驾驶员驾驶汽车,只需要操作方向盘、档杆、离合器、刹车、油门这几个主要接口,而汽车内部的一组操作则不需要驾驶员考虑,比如驾驶员踩刹车后,车子就会停下来,而系统内部实际上通过“刹车”这一接口,经过一系列的机械传动到达刹车片。

再比如,一套豪华的家庭影院,用户只需要简单点击遥控器上的“开始”按钮,一系列诸如:关闭窗帘、打开投影仪、打开音响、放下屏幕就都可以自动完成。

二、外观模式类图

以家庭影院案例为参考,遥控器或操作界面提供了统一的外观接口,接口组装了一系列子系统运行动作:

三、代码实现

窗帘子系统:

public class Curtain {public void up() {System.out.println("窗帘升起...");}public void down() {System.out.println("窗帘降下...");}
}

音响子系统:

public class Sound {public void on() {System.out.println("打开音响...");}public void off() {System.out.println("关闭音响...");}
}

播放器:

public class Player {public void play() {System.out.println("开始播放...");}public void pause() {System.out.println("暂停播放...");}public void stop() {System.out.println("退出播放器...");}
}

投影仪子系统:

public class Projector {private Player player;public void init(Player player) {this.player = player;}public void on() {System.out.println("打开投影机...");player.play();}public void off() {player.stop();System.out.println("关闭投影机...");}
}

家庭影院外观类:

public class HomeTheatre {private Curtain curtain;private Projector projector;private Player player;private Sound sound;public HomeTheatre(Curtain curtain, Projector projector, Player player, Sound sound) {super();this.curtain = curtain;this.projector = projector;this.player = player;this.sound = sound;}/** 一键启动*/public void start() {curtain.down();projector.init(player);sound.on();projector.on();}/** 暂停播放*/public void pause() {player.pause();}/** 退出家庭影院*/public void exitAll() {curtain.up();sound.off();projector.off();}
}

Client调用端:

public class Client {public static void main(String[] args) {HomeTheatre homeTheatre = new HomeTheatre(new Curtain(), new Projector(), new Player(), new Sound());System.out.println("-----打开家庭影院------");homeTheatre.start();System.out.println("-----暂停播放------");homeTheatre.pause();System.out.println("-----退出家庭影院------");homeTheatre.exitAll();}
}

执行结果:

-----打开家庭影院------
窗帘降下...
打开音响...
打开投影机...
开始播放...
-----暂停播放------
暂停播放...
-----退出家庭影院------
窗帘升起...
关闭音响...
退出播放器...
关闭投影机...

总结

外观模式就是把一部分基础功能一致的代码抽离到单独的子模块中,然后在外观类中聚合使用;或者在设计之初就将业务流设计为多个子系统组合的流水线式,无论哪种方式,外观模式都会让代码的执行逻辑一目了然。

如果过去只是把一堆业务逻辑全部放到一个类中去写,那这只能算得上是面向过程编程。如果你能够把一些代码提出到多个类中去然后依赖它们的话,就成了高大上的外观模式。

外观模式虽然极容易理解,但是它并不符合开闭原则,也不要盲目使用。

在Spring 容器环境的初始化阶段就用到了外观模式,一步一步地执行各个子系统的初始化工作。

Java常用设计模式————外观模式相关推荐

  1. Java常用设计模式————原型模式(一)

    介绍 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. 原型模式用于创建重复的对象,同时又能保证性能.当直接创建对象的代价比较大时,则采用 ...

  2. Java常用设计模式————工厂模式

    简介: 工厂模式(Factory Pattern)是Java中最常用的设计模式之一,又称多态工厂模式.虚拟构造器模式.属于创建型模式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通 ...

  3. Java常用设计模式————组合模式

    引言 组合模式,是一种类似递归算法的结构性设计模式,通过以简单的 List ,组合本类对象,实现树状对象结构的"部分.整体"的层次. 它可以让调用程序不需要关心复杂对象与简单对象的 ...

  4. Java常用设计模式-策略模式

    策略模式是一个非常实用的设计模式,指定义了一类算法并将其封装起来,并使得它们之间可以灵活地切换,并且不影响客户端. 1,从一个例子开始 我们常常会在网上买东西,很多购物平台都会有着各种各样的优惠策略供 ...

  5. Java 常用设计模式 -- Builder模式

    Builder模式是在Java中最流行的模式之一.它很简单,有助于保持对象不可变,并且可以使用Project Lombok的@Builder或Immutables等工具生成,仅举几例. 模式的流畅变体 ...

  6. Java常用设计模式————桥接模式

    引言 在实际的业务中,经常会遇到多维度的概念组合,公园的门票,颐和园有年票.月票.日票,故宫也有年票.月票.日票.那么不同的公园和票种类型就可以视为两种不同的纬度,它们之间会形成相互组合的关系. 在类 ...

  7. Java常用设计模式————建造者模式

    引言 建造者模式(Builder Pattern)使用多个简单对象一步一步构建成一个复杂的对象.这种类型的设计模式属于建造型模式,它提供了一种创建对象的最佳方式. 一个Builder会一步步构建最终的 ...

  8. Java常用设计模式————原型模式(二)之深拷贝与浅拷贝

    引言 clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言 ...

  9. 初学Java常用设计模式之——原型模式

    声明:转载请附上原文链接 提示:标题序号从3开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--工厂模式 序号从2开始. 标题后面之所以加上了解,是因为相对 ...

最新文章

  1. java线程的异常无法捕获异常_Java如何从线程中捕获异常
  2. Android之View绘制流程源码分析
  3. 思科3750开启策略路由功能
  4. TCP/IP 协议栈及 OSI 参考模型详解--云平台技术栈04
  5. Java计算器接口策略_Java 基础 接口 ——运算
  6. 【MFC】自绘对话框动画效果的状态栏
  7. 使用Enterprise Architecture绘制10种UML画画
  8. C++中读取文件乱码问题
  9. linux 报错 bash ‘/bin/sh: Syntax error: “(” unexpected
  10. (转)LIB和DLL的区别与使用
  11. protel99se中文版
  12. 从亏损19亿到盈利6亿,恺英网络做对了什么?
  13. CentOS 7下atime如何变化的问题(转)
  14. 2006年10大变态站名网站排名
  15. Python: sys.path.append()用法
  16. 简析JavaScript 事件绑定、事件冒泡、事件捕获和事件执行顺序
  17. 批量绘图 | EXCEL绘制基站扇区地图
  18. 医院病历的中英文翻译,医生病历本翻译
  19. 快速干净卸载Oracle
  20. RVMedia组件Crack,IP 摄像机接收视频

热门文章

  1. uselocale_Java扫描仪useLocale()方法与示例
  2. 字符串操作的12个小技巧!
  3. SQLServer 2012重启服务后,自增1的标识列一次增长了1000左右
  4. Oracle数据库中表格的级联删除问题
  5. QT5快速转换路径(/斜杠与\反斜杠转换)
  6. VS2010中使用sprintf出现warning C4997: 'sprintf': This function or variable may be unsafe.
  7. Pytorch torchvision完成Faster-rcnn目标检测demo及源码详解
  8. java在文档末尾添加_如何在打开表单后将子文件添加到Word文档的末尾?
  9. 485通讯线是几芯的_小令老师说门禁| 为什么485门禁必然会取代韦根?
  10. 三角函数π/2转化_【高中数学说课】三角函数的诱导公式