1.UML类图
2. 实例概况
- 背景:小成的爷爷已经80岁了,一个人在家生活:每次都需要打开灯、打开电视、打开空调;睡觉时关闭灯、关闭电视、关闭空调;
- 冲突:行动不方便,走过去关闭那么多电器很麻烦,代码如下:
**1. **电器类:
1 //灯类 2 public class SubSystemA_Light { 3 public void on(){ 4 System.out.println("打开了灯...."); 5 } 6 7 public void off(){ 8 System.out.println("关闭了灯...."); 9 } 10 } 11 12 //电视类 13 public class SubSystemB_Television { 14 public void on(){ 15 System.out.println("打开了电视...."); 16 } 17 18 public void off(){ 19 System.out.println("关闭了电视...."); 20 } 21 } 22 23 //空调类 24 public class SubSystemC_Aircondition { 25 public void on(){ 26 System.out.println("打开了电视...."); 27 } 28 29 public void off(){ 30 System.out.println("关闭了电视...."); 31 } 32 }
**2. **客户端调用:小成爷爷使用电器情况
1 public class Facade Pattern{ 2 public static void main(String[] args){ 3 { 4 SubSystemA_Light light = new SubSystemA_Light(); 5 SubSystemB_Television television = new SubSystemB_Television(); 6 SubSystemC_Aircondition aircondition = new SubSystemC_Aircondition(); 7 8 //起床后开电器 9 System.out.prinln("起床了"); 10 light.on(); 11 television.on(); 12 aircondition.on(); 13 System.out.prinln("可以看电视了"); 14 15 //睡觉时关电器 16 System.out.prinln("睡觉了"); 17 light.off(); 18 television.off(); 19 aircondition.off(); 20 System.out.prinln("可以睡觉了"); 21 } 22 }
结果
起床了
打开了灯
打开了电视
打开了空调
可以看电视了
睡觉了
关闭了灯
关闭了电视
关闭了空调
可以睡觉了
从上面可以看出,在不使用外观模式的情况下,小成爷爷需要对每个电器都进行操作,非常不方便
客户端与三个子系统都发送了耦合,使得客户端程序依赖与子系统
解决方案
小成买了一个智能家具控制器(外观对象/统一接口)给他爷爷,他爷爷只需要一键就能打开/关闭 灯、电视机、空调
- 即用外观模式来为所有子系统设计一个统一的接口
- 客户端只需要调用外观类中的方法就可以了,简化了客户端的操作
**1. **电器类同上
**2. **外观类:智能遥控器
1 public class Facade{ 2 3 SubSystemA_Light light; 4 SubSystemB_Television television ; 5 SubSystemC_Aircondition aircondition; 6 7 8 //传参 9 public Facade(SubSystemA_Light light,SubSystemB_Television television,SubSystemC_Aircondition aircondition){ 10 this.light = light; 11 this.television = television ; 12 this.aircondition =aircondition; 13 14 } 15 //起床后一键开电器 16 public void on{ 17 System.out.prinln("起床了"); 18 light.on(); 19 television.on(); 20 aircondition.on(); 21 22 } 23 24 //睡觉时一键关电器 25 System.out.prinln("睡觉了"); 26 light.off(); 27 television.off(); 28 aircondition.off(); 29 } 30 31 32 33 }
**3. **客户端调用:爷爷使用智能遥控器的时候
1 public class Facade Pattern{ 2 public static void main(String[] args){ 3 { 4 //实例化电器类 5 SubSystemA_Light light = new SubSystemA_Light(); 6 SubSystemB_Television television = new SubSystemB_Television(); 7 SubSystemC_Aircondition aircondition = new SubSystemC_Aircondition(); 8 9 //传参 10 Facade facade = new Facade(light,television,aircondition); 11 12 //客户端直接与外观对象进行交互 13 facade.on; 14 System.out.prinln("可以看电视了"); 15 facade.off; 16 System.out.prinln("可以睡觉了");
结果
起床了
打开了灯
打开了电视
打开了空调
可以看电视了
睡觉了
关闭了灯
关闭了电视
关闭了空调
可以睡觉了
通过上述这个常见的生活例子,我相信你已经完全明白了外观模式的原理了!!