一、是什么
定义:简化一群类的接口,达到屏蔽代码的复杂度
使用场景: 封装一系列复杂接口,以提供一个服务,简化接口
二、示例
现在模拟在家看漫威,哈哈哈
复杂版:
- 打开遥控器
- 选择电影栏目
- 选择钢铁侠
- 打开电影
使用外观模式,将负责封装后就变为:
1. 打开钢铁侠电影
代码:
/** * 遥控器类 */ public class RemoteControl { public void openTV() { System.out.println("打开电视"); } }
电视类
/** * 电视类 */ public class TV { /** * 选择电影频道 */ public void choiceFilmChannel() { System.out.println("选择电影频道"); } /** * 选择钢铁侠 */ public void choiceIronMan() { System.out.println("选择钢铁侠电影"); } /** * 打开电影 */ public void openFilm() { System.out.println("打开电影"); } }
测试类:没有用外观模式时,我们需要这几步能看电影
/** * 看钢铁侠电影 测试类 */ public class Test { public static void main(String[] args) { // ================== 复杂的方式 ========================= RemoteControl remoteControl = new RemoteControl(); TV tv = new TV(); remoteControl.openTV(); tv.choiceFilmChannel(); tv.choiceIronMan(); tv.openFilm(); } }
使用外观模式
/** * 外观模式下的看电影 */ public class SeeFilmFacade { public void seeFilm() { RemoteControl remoteControl = new RemoteControl(); TV tv = new TV(); remoteControl.openTV(); tv.choiceFilmChannel(); tv.choiceIronMan(); tv.openFilm(); } }
测试类: 使用外观模式
/** * 看钢铁侠电影 测试类 */ public class Test { public static void main(String[] args) { // ================== 外观模式 ========================= SeeFilmFacade seeFilmFacade = new SeeFilmFacade(); seeFilmFacade.seeFilm(); } }
三、总结
这个模式看似简单,实际也简单
里面有个原则需关注:最少知识原则
要点:
- 外观模式不是简化接口,也将客户从组件的子系统中解耦
- 外观模式和适配器都可以包装类,但外观模式的意图是简化接口