源无极

导航

 

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. **电器类同上

**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("可以睡觉了"); 

 

结果

起床了
打开了灯
打开了电视
打开了空调
可以看电视了

睡觉了
关闭了灯
关闭了电视
关闭了空调
可以睡觉了

通过上述这个常见的生活例子,我相信你已经完全明白了外观模式的原理了!!



 

posted on 2018-12-14 21:32  源无极  阅读(84)  评论(0编辑  收藏  举报