博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式学习专栏七--------外观模式
阅读量:5886 次
发布时间:2019-06-19

本文共 2712 字,大约阅读时间需要 9 分钟。

设计模式学习专栏七--------外观模式

场景


在我们进入外观模式之前 , 让我们看一个风行全美的热潮: 建立自己的家庭影院

经过一番研究比较,你组装了一套杀手级别的系统 , 内含DVD播放器, 投影机, 自动屏幕, 环绕立体声 ,甚至还有爆米花机.

以下是相关的组件

正当一切部署完成,想要开始享受一部电影时,却发现...

使用代码实现看电影

出现的问题

我们的客户端需要面对太多具体的组件了 ! 导致操作家庭影院很麻烦

如何解决


使用外观模式, 通过实现一个提供更合理的接口的外观类 , 让我们可以将一个复杂的子系统变得更容易使用

外观模式总览


定义:提供了一个统一的接口,用于访问子系统中的一群接口. 外观定义了一个高层接口,让子系统更容易使用

  • 模式的理解

    • 类图

    • 角色

      • 客户 : 客户只有一个朋友,也就是外观 , 避免了和系统中太多的类耦合到了一起
      • 外观类 : 外观类帮助客户管理全部子系统组件,它的存在让客户变得简单又有弹性
      • 子系统中的类
  • 外观模式与适配器模式的区别

    • 适配器的意图是要转换被适配接口 成客户期望的另一个接口 而外观的意图是要统一和简化接口

核心代码部分

主程序

public class HomeTheaterTestDrive {	public static void main(String[] args) {		Amplifier amp = new Amplifier("Top-O-Line Amplifier");		Tuner tuner = new Tuner("Top-O-Line AM/FM Tuner", amp);		DvdPlayer dvd = new DvdPlayer("Top-O-Line DVD Player", amp);		CdPlayer cd = new CdPlayer("Top-O-Line CD Player", amp);		Projector projector = new Projector("Top-O-Line Projector", dvd);		TheaterLights lights = new TheaterLights("Theater Ceiling Lights");		Screen screen = new Screen("Theater Screen");		PopcornPopper popper = new PopcornPopper("Popcorn Popper");		HomeTheaterFacade homeTheater =				new HomeTheaterFacade(amp, tuner, dvd, cd,						projector, screen, lights, popper); 		//客户只与外观直接交互		homeTheater.watchMovie("Raiders of the Lost Ark");		homeTheater.endMovie();	}}复制代码

外观

public class HomeTheaterFacade {	Amplifier amp;		//子系统中的各个组件	Tuner tuner;	DvdPlayer dvd;	CdPlayer cd;	Projector projector;	TheaterLights lights;	Screen screen;	PopcornPopper popper; 	public HomeTheaterFacade(Amplifier amp, 				 Tuner tuner, 				 DvdPlayer dvd, 				 CdPlayer cd, 				 Projector projector, 				 Screen screen,				 TheaterLights lights,				 PopcornPopper popper) { 		this.amp = amp;		this.tuner = tuner;		this.dvd = dvd;		this.cd = cd;		this.projector = projector;		this.screen = screen;		this.lights = lights;		this.popper = popper;	} 	public void watchMovie(String movie) {		System.out.println("Get ready to watch a movie...");		popper.on();		popper.pop();		lights.dim(10);		screen.down();		projector.on();		projector.wideScreenMode();		amp.on();		amp.setDvd(dvd);		amp.setSurroundSound();		amp.setVolume(5);		dvd.on();		dvd.play(movie);	}}复制代码
  • 输出结果

    Get ready to watch a movie...Popcorn Popper onPopcorn Popper popping popcorn!Theater Ceiling Lights dimming to 10%Theater Screen going downTop-O-Line Projector onTop-O-Line Projector in widescreen mode (16x9 aspect ratio)Top-O-Line Amplifier onTop-O-Line Amplifier setting DVD player to Top-O-Line DVD PlayerTop-O-Line Amplifier surround sound on (5 speakers, 1 subwoofer)Top-O-Line Amplifier setting volume to 5Top-O-Line DVD Player onTop-O-Line DVD Player playing "Raiders of the Lost Ark"复制代码

参考

​ 书籍: HeadFirst设计模式

​ 代码参考地址:

转载于:https://juejin.im/post/5c867839f265da2db718579d

你可能感兴趣的文章
快速排序的总结
查看>>
Linux系统详细启动流程
查看>>
论坛教程-去除版块导航
查看>>
linux下mysql的初始密码
查看>>
vim常用命令
查看>>
使用eclipse Maven插件创建一个web project
查看>>
我的友情链接
查看>>
成熟的标志
查看>>
慢慢的才知道
查看>>
ubuntu12.04TLS安装CodeBlocks
查看>>
待看博客
查看>>
加解密技术基础
查看>>
nginx和php-fpm优化
查看>>
分享一个zookeeper批量启动脚本
查看>>
mysql 遇到问题
查看>>
测试系统磁盘预读对PostgreSQL性能的影响
查看>>
使用过的终端命令汇集
查看>>
博客群发软件--用 Windows Live Writer完美发布新浪、网易、blogcn、blogbus、cnbl
查看>>
dubbo 安装部署Windows
查看>>
eclipse 导入maven 父子项目
查看>>