外观设计模式
一、外观设计模式
1、介绍
- 外观模式(Facade),也叫“过程模式”。
- 外观模式定义了一个高层接口,用以屏蔽内部子系统的细节,使得客户端只需跟这个接口发生调用,而无需关心这个子系统的内部细节。简化了客户端操作。
2、UML原理类图
外观类(Facade):为客户端提供统一的调用接口,外观类知道哪些子系统负责处理请求,从而将客户端的请求代理给适当子系统对象
客户端(调用者):外观接口的调用者
子系统集合:指模块或者子系统,处理Facade对象指派的任务,功能的实际提供者
3、外观模式的使用
(1)外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性
(2)外观模式是对客户端与子系统之间的耦合关系达到解耦的目的,让子系统内部的模块更容易维护和扩展
(3)通过合理的使用外观模式,可以帮助我们更好的划分访问的层次
(4)当系统需要进行分成设计时,可以考虑使用Facade模式
(5)在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade类,来提供遗留系统中比较清晰简单的接口,让新系统与Facade类交互,提高复用性
(6)不能过多或者不合理的使用外观模式。无论是使用外观模式,还是直接调用模块,要让系统有层次,利于维护为主要目的。
二、普通方式编程
1、介绍
(1)需求
智能家居建设,早上起床前30分钟,定时器执行命令,控制家中的智能家居执行以下步骤:
开启热水器
开启空调
开启咖啡机
30分钟后(起床)
开启灯光
播放新闻
放洗澡水-拿咖啡-洗澡
出门关闭各种设备
(2)弊端
- 在Client的main方法中,创建了各个子系统(智能家居)的对象,并直接调用子系统(对象)相关方法,对于Client来说,这样会造成调用过程混乱,没有清晰的过程
- 不利于在Client中,去维护对子系统(智能家居)的操作
2、UML
3、代码
/*** @description: 热水器* @author: dashu* @create: 14:38*/public class WaterHeater {public void on(){System.out.println("打开热水器");}public void off(){System.out.println("关闭热水器");}}
/*** @description: 空调* @author: dashu* @create: 14:39*/public class AirConditioner {public void on(){System.out.println("打开空调");}public void off(){System.out.println("关闭空调");}}
/*** @description: 咖啡机* @author: dashu* @create: 14:40*/public class CoffeeMaker {public void on(){System.out.println("打开咖啡机");}public void off(){System.out.println("关闭咖啡机");}}
/*** @description: 灯光* @author: dashu* @create: 14:43*/public class Lamplight {public void on(){System.out.println("打开灯光");}public void off(){System.out.println("关闭灯光");}}
/*** @description: 新闻* @author: dashu* @create: 14:44*/public class Journalism {public void on(){System.out.println("打开新闻");}public void off(){System.out.println("关闭新闻");}}
/*** @description: 客户端* @author: dashu* @create: 14:24*/public class Client {/*** 智能家居* 1、早上起床前30分钟,定时器执行命令,控制家中的智能家居执行以下步骤:* 开启热水器* 开启空调* 开启咖啡机* 30分钟后(起床)* 开启灯光* 播放新闻* 放洗澡水-拿咖啡-洗澡* 出门关闭各种设备*/public static void main(String[] args) {System.out.println("---起床前30分钟---");WaterHeater waterHeater = new WaterHeater();waterHeater.on();AirConditioner airConditioner = new AirConditioner();airConditioner.on();CoffeeMaker coffeeMaker = new CoffeeMaker();coffeeMaker.on();Lamplight lamplight = new Lamplight();lamplight.on();Journalism journalism = new Journalism();journalism.on();System.out.println("---起床---");System.out.println("放洗澡水-拿咖啡-洗澡");System.out.println("---出门---");waterHeater.off();airConditioner.off();coffeeMaker.off();lamplight.off();journalism.off();}}
二、外观设计模式编程
1、介绍
外观模式可以理解为转换一群接口,客户端只需要调用一个接口,而不用调用多个接口才能达到目的
外观模式就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用
2、UML
3、代码
/*** @description: 热水器* @author: dashu* @create: 14:38*/public class WaterHeater {private static WaterHeater waterHeater = new WaterHeater();private WaterHeater() { }public static WaterHeater instance(){return waterHeater;}public void on(){System.out.println("打开热水器");}public void off(){System.out.println("关闭热水器");}}
/*** @description: 空调* @author: dashu* @create: 14:39*/public class AirConditioner {private static AirConditioner airConditioner = new AirConditioner();private AirConditioner() { }public static AirConditioner instance(){return airConditioner;}public void on(){System.out.println("打开空调");}public void off(){System.out.println("关闭空调");}}
/*** @description: 咖啡机* @author: dashu* @create: 14:40*/public class CoffeeMaker {private static CoffeeMaker coffeeMaker = new CoffeeMaker();private CoffeeMaker() { }public static CoffeeMaker instance(){return coffeeMaker;}public void on(){System.out.println("打开咖啡机");}public void off(){System.out.println("关闭咖啡机");}}
/*** @description: 灯光* @author: dashu* @create: 14:43*/public class Lamplight {private static Lamplight lamplight = new Lamplight();private Lamplight() { }public static Lamplight instance(){return lamplight;}public void on(){System.out.println("打开灯光");}public void off(){System.out.println("关闭灯光");}}
/*** @description: 新闻* @author: dashu* @create: 14:44*/public class Journalism {private static Journalism journalism = new Journalism();private Journalism() { }public static Journalism instance(){return journalism;}public void on(){System.out.println("打开新闻");}public void off(){System.out.println("关闭新闻");}}
/*** @description: 智能家居外观者模式* @author: dashu* @create: 14:56*/public class SmartHomeFacade {private WaterHeater waterHeater;private AirConditioner airConditioner;private CoffeeMaker coffeeMaker;private Lamplight lamplight;private Journalism journalism;public SmartHomeFacade(){this.waterHeater = WaterHeater.instance();this.airConditioner = AirConditioner.instance();this.coffeeMaker = CoffeeMaker.instance();this.lamplight = Lamplight.instance();this.journalism = Journalism.instance();}/*** 开启*/public void on(){waterHeater.on();airConditioner.on();coffeeMaker.on();lamplight.on();journalism.on();}/*** 关闭*/public void off(){waterHeater.off();airConditioner.off();coffeeMaker.off();lamplight.off();journalism.off();}}
/*** @description: 客户端* @author: dashu* @create: 15:04*/public class Client {/*** 智能家居* 1、早上起床前30分钟,定时器执行命令,控制家中的智能家居执行以下步骤:* 开启热水器* 开启空调* 开启咖啡机* 30分钟后(起床)* 开启灯光* 播放新闻* 放洗澡水-拿咖啡-洗澡* 出门关闭各种设备*/public static void main(String[] args) {System.out.println("---起床前30分钟---");SmartHomeFacade smartHomeFacade = new SmartHomeFacade();smartHomeFacade.on();System.out.println("---起床---");System.out.println("放洗澡水-拿咖啡-洗澡");System.out.println("---出门---");smartHomeFacade.off();}}
