《Head First 设计模式》:外观模式
正文
一、定义
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
要点:
- 外观模式将一个或数个类的复杂的一切都隐藏在背后,只显露出一个干净美好的外观。
- 通过将子系统的方法封装到外观的方法中,可以达到对子系统的“一键操作”。
- 外观模式的意图是简化接口,好让一个子系统更易于使用。
- 外观模式将客户从组件的子系统中解耦。
二、实现步骤
1、创建子系统组件类
(1)子系统组件A
/**
* 子系统组件A
*/
public class ComponentA {
public void action() {
System.out.println("ComponentA action...");
}
}
(2)子系统组件B
/**
* 子系统组件B
*/
public class ComponentB {
public void action() {
System.out.println("ComponentB action...");
}
}
(3)子系统组件C
/**
* 子系统组件C
*/
public class ComponentC {
public void action() {
System.out.println("ComponentC action...");
}
}
2、创建外观类
外观类的方法封装了子系统组件的一系列方法。这样,客户就可以通过外观类的方法,来一次性调用一系列子系统组件的方法。而不是一个个去调用子系统组件的方法。
/**
* 外观类
*/
public class Facade {
ComponentA componentA;
ComponentB componentB;
ComponentC componentC;
public Facade(ComponentA componentA,
ComponentB componentB,
ComponentC componentC) {
this.componentA = componentA;
this.componentB = componentB;
this.componentC = componentC;
}
/**
* 通过外观类,请求子系统组件
*/
public void request() {
componentA.action();
componentB.action();
componentC.action();
}
}
3、使用外观访问子系统组件
public class Test {
public static void main(String[] args) {
// 子系统组件
ComponentA componentA = new ComponentA();
ComponentB componentB = new ComponentB();
ComponentC componentC = new ComponentC();
// 外观类
Facade facade = new Facade(componentA, componentB, componentC);
facade.request();
}
}
三、举个栗子
1、背景
假设你打算建立自己的家庭影院,通过一番研究比较,你组装了一套杀手级的系统,内含 DVD 播放器、投影机、自动屏幕、环绕立体声,甚至还有爆米花机。
你花了几个星期布线、挂上投影机、连接所有的装置并进行微调。现在你打算播放一部 DVD 影片放松一下。
但是你发现,在看电影前,必须先进行一系列操作:打开爆米花机 -> 开始爆米花 -> 将灯光调暗 -> 放下屏幕 -> 打开投影机 -> 将投影机的输入切换到 DVD -> 将投影机设置在宽屏模式 -> 打开功放 -> 将功放的输入设置为 DVD -> 将功放设置为环绕立体声 -> 将功放音量调到中(5) -> 打开 DVD 播放器 -> 开始播放 DVD。
不仅如此,看完电影后,你还要把一切都关掉。使用你的家庭影院竟变得如此复杂!于是你决定升级你的系统……
2、实现
使用外观模式将看电影相关的一系列操作,封装到外观的 watchMovie() 方法中。这样一来,要看电影的时候,只需要进行一个“看电影”的操作就行了。同理,可将看完电影相关的一系列操作,封装到 endMovie() 方法中。
(1)创建家庭影院子系统组件
/**
* 功放
*/
public class Amplifier {
/**
* 打开功放
*/
public void on() {
System.out.println("Top-O-Line Amplifier on");
}
/**
* 关闭功放
*/
public void off() {
System.out.println("Top-O-Line Amplifier off");
}
/**
* 设置DVD
*/
public void setDvd(DvdPlayer dvd) {
System.out.println("Top-O-Line Amplifier setting DVD player to Top-O-Line DVD Player");
}
/**
* 设置为环绕立体声
*/
public void setSurroundSound() {
System.out.println("Top-O-Line Amplifier surround sound on (5 speakers, 1 subwoofer)");
}
/**
* 调节音量
*/
public void setVolume(int volume) {
System.out.println("Top-O-Line Amplifier setting volume to " + volume);
}
}
/**
* DVD播放器
*/
public class DvdPlayer {
/**
* 打开DVD播放器
*/
public void on() {
System.out.println("Top-O-Line DVD Player on");
}
/**
* 关闭DVD播放器
*/
public void off() {
System.out.println("Top-O-Line DVD Player off");
}
/**
* 播放DVD
*/
public void play(String movie) {
System.out.println("Top-O-Line DVD Player playing “" + movie + "”");
}
/**
* 停止播放DVD
*/
public void stop() {
System.out.println("Top-O-Line DVD Player stop");
}
/**
* 弹出DVD
*/
public void eject() {
System.out.println("Top-O-Line DVD Player eject");
}
}
/**
* 投影仪
*/
public class Projector {
/**
* 打开投影仪
*/
public void on() {
System.out.println("Top-O-Line Projector on");
}
/**
* 关闭投影仪
*/
public void off() {
System.out.println("Top-O-Line Projector off");
}
/**
* 设为宽屏模式
*/
public void wideScreenMode() {
System.out.println("Top-O-Line Projector in widescreen mode (16x9 aspect ratio)");
}
}
/**
* 影院灯光
*/
public class TheaterLights {
/**
* 打开灯光
*/
public void on() {
System.out.println("Theater Ceiling Lights on");
}
/**
* 调暗灯光
*/
public void dim(int level) {
System.out.println("Theater Ceiling Lights dimming to " + level + "%");
}
}
/**
* 屏幕
*/
public class Screen {
/**
* 放下屏幕
*/
public void down() {
System.out.println("Theater Screen going down");
}
/**
* 升起屏幕
*/
public void up() {
System.out.println("Theater Screen going up");
}
}
/**
* 爆米花机
*/
public class PopcornPopper {
/**
* 打开爆米花机
*/
public void on() {
System.out.println("Popcorn Popper on");
}
/**
* 关闭爆米花机
*/
public void off() {
System.out.println("Popcorn Popper off");
}
/**
* 开始爆米花
*/
public void pop() {
System.out.println("Popcorn Popper popping popcorn!");
}
}
(2)创建家庭影院外观
/**
* 家庭影院外观
*/
public class HomeTheaterFacade {
Amplifier amp;
DvdPlayer dvd;
Projector projector;
TheaterLights lights;
Screen screen;
PopcornPopper popper;
public HomeTheaterFacade(Amplifier amp,
DvdPlayer dvd,
Projector projector,
TheaterLights lights,
Screen screen,
PopcornPopper popper) {
this.amp = amp;
this.dvd = dvd;
this.projector = projector;
this.lights = lights;
this.screen = screen;
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);
}
/**
* 看完电影
*/
public void endMovie() {
System.out.println("Shuting movie theater down...");
popper.off();
lights.on();
screen.up();
projector.off();
amp.off();
dvd.stop();
dvd.eject();
dvd.off();
}
}
(3)使用家庭影院外观观看电影
public class Test {
public static void main(String[] args) {
// 子系统组件
Amplifier amp = new Amplifier();
DvdPlayer dvd = new DvdPlayer();
Projector projector = new Projector();
TheaterLights lights = new TheaterLights();
Screen screen = new Screen();
PopcornPopper popper = new PopcornPopper();
// 家庭影院外观
HomeTheaterFacade homeTheater = new HomeTheaterFacade(amp, dvd, projector, lights, screen, popper);
// 看电影
homeTheater.watchMovie("Raiders of the Lost Ark");
// 看完电影
homeTheater.endMovie();
}
}
《Head First 设计模式》:外观模式的更多相关文章
- java设计模式——外观模式(门面模式)
一. 定义与类型 定义:门面模式,提供一个统一的接口,用来访问子系统中的一群接口,门面模式定义了一个高层接口,让子系统更容易使用 类型:结构性 二. 使用场景 子系统越来越复杂,增加外观模式提供简单调 ...
- Java设计模式——外观模式
JAVA 设计模式 外观模式 用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构
- 浅谈Python设计模式 - 外观模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 外观模式 外观模式的核心在于将复杂的内部实现包装起来,只向外界提供简单的调用接口 ...
- 【设计模式】Java设计模式 - 外观模式
Java设计模式 - 外观模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...
- C#设计模式-外观模式
在软件开发过程中,客户端程序经常会与复杂系统的内部子系统进行耦合,从而导致客户端程序随着子系统的变化而变化,然而为了将复杂系统的内部子系统与客户端之间的依赖解耦,从而就有了外观模式,也称作 ”门面“模 ...
- [Head First设计模式]生活中学设计模式——外观模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- JAVA 设计模式 外观模式
用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构
- Java设计模式---外观模式
外观模式(Facade) 外观模式的意图是:为子系统提供一个接口,便于它的使用. 解释: 简单的说,外观模式就是封装多个上层应用需要的方法,使得上层调用变得简单,为上层提供简单的接口,是设计模式中 ...
- 设计模式——外观模式(Facade)
1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性. 例子1:一个电源总开关可以控制四盏灯 ...
- 设计模式 | 外观模式/门面模式(facade)
定义: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 结构:(书中图,侵删) 一个简洁易用的外观类 一个复杂的子系统 实例: 书中提到了理 ...
随机推荐
- 远光武汉研发中心区块链事业部Java面试总结
面试在约定的时间准时进行,也是采用腾讯会议远程面试的方式.但是这是我第一次遇到面试官未打开摄像头的情况,后面经过沟通,双方都打开摄像头进行交流. 之前了解这个岗位主要是区块链相关的Java开发,所以事 ...
- 2020牛客暑期多校训练营 第二场 C Cover the Tree 构造 贪心
LINK:Cover the Tree 最受挫的是这道题,以为很简单 当时什么都想不清楚. 先胡了一个树的直径乱搞的贪心 一直过不去.后来意识到这类似于最经典长链剖分优化贪心的做法 然后那个是求最大值 ...
- 搭建Redis主从复制的集群
在主从复制模式的集群里,主节点一般是一个,从节点一般是两个或多个,写入主节点的数据会被复制到从节点上,这样一旦主节点出现故障,应用系统能切换到从节点去读写数据,这样能提升系统的可用性.而且如果再采用主 ...
- SpringBoot+Dynamic多数据源动态切换
最近做了个小模块,需求就是项目同时读取三个数据库,操作数据.并不是分库分表,只用定时跑,不需要对外提供接口. 技术选型:SpringBoot + Mybatis Plus(Mybatis) + Dyn ...
- Xposed原理分析
目录 安卓系统启动 什么zygote? 安卓应用运行? Xposed介绍 Xposed构成 Xposed初始化大体工作流程 源码分析 初始化 app_main#main app_main#initia ...
- DeepVO: Towards End-to-End Visual Odometry with Deep Recurrent Convolutional Neural Networks
1.Introduction DL解决VO问题:End-to-End VO with RCNN 2.Network structure a.CNN based Feature Extraction 论 ...
- Linux输出缓存你知道多大吗?
今天看到这个代码很简单,就是验证一下Linux系统的输出缓存大小.当 猜一下这个代码的输出: #include <stdio.h> #include <string.h> #i ...
- Spring Boot 集成 Elasticsearch 实战
最近有读者问我能不能写下如何使用 Spring Boot 开发 Elasticsearch(以下简称 ES) 相关应用,今天就讲解下如何使用 Spring Boot 结合 ES. 可以在 ES 官方文 ...
- 【模式识别与机器学习】——3.5Fisher线性判别
---恢复内容开始--- 出发点 应用统计方法解决模式识别问题时,一再碰到的问题之一就是维数问题. 在低维空间里解析上或计算上行得通的方法,在高维空间里往往行不通. 因此,降低维数有时就会成为处理实际 ...
- Visual Studio Code中设置sftp同步代码到服务器
## **前言** - 绝对的大佬才会直接在Linux下用vim写代码,我等小白只能通过IDE来了,所以将代码同步到服务器上就很重要了.使用vs code设置好sftp就可以实现这一功能. - 设置之 ...