java外观模式(Facade)

1.外观模式(Facade [fə'sɑd] n. 正面;表面;外观)

     外观模式:可以理解为 中介模式(没错,就是在用户与系统之间,增加了一个类,而这个类就是外观类,所以这个模式就叫外观模式)

    如下图:

     

      在如下图:

         

       

2.代码实现,我们就以第二个图为例子

    2.1.首先创建三个子系统类

           创建Cpu类:

 1 package design.pattern.facade;
 2 
 3 public class Cpu {
 4     public void turnOn() {
 5         System.out.println("启动CPU");
 6     }
 7 
 8     public void shutdown() {
 9         System.out.println("关闭CPU");
10     }
11 }
View Code

          同理创建Memery类:

 1 package design.pattern.facade;
 2 
 3 public class Memery {
 4     public void turnOn() {
 5         System.out.println("加载内存");
 6     }
 7 
 8     public void shutdown() {
 9         System.out.println("释放内存");
10     }
11 }
View Code

          最后创建Disk类:

 1 package design.pattern.facade;
 2 
 3 public class Disk {
 4    public void turnOn(){
 5        System.out.println("加载硬盘");
 6    }
 7    
 8    public void shutdown(){
 9        System.out.println("关闭硬盘");
10    }
11 }
View Code

    2.2. 创建外观类,或者叫 中介类 Computer,为了能够使用多态,这里先创建一个Computer的抽象类

 1 package design.pattern.facade;
 2 
 3 /*
 4  * Computer就是外观接口类,
 5  * 这里是要使用接口或者抽象类的了,到时用户调用的都是这种类型的,
 6  * 这样就算我们修改了内部,对用户的操作都没有影响
 7  * **/
 8 public abstract class Computer {
 9     public abstract void turnOn();
10     public abstract void shutdown();
11 }
View Code

          在创建一个DellComputer继承了Computer类:

 1 package design.pattern.facade;
 2 
 3 public class DellComputer extends Computer{
 4     //这个是关键,这里声明为private是防止用户直接去调用这些子系统
 5     //保证了用户只能通过外观类来进行访问
 6     
 7     //同时这里也是缺点,当新增子系统是必须手动修改DellComputer
 8     private Cpu cpu;
 9     private Memery mem;
10     private Disk disk;
11     
12     //这个构造方法也很有意思,若没有参数,则自行创建新的子系统,CPU,内存,Disk这些都可以看作子系统
13     public DellComputer(){
14         this.cpu = new Cpu();
15         this.mem = new Memery();
16         this.disk = new Disk();
17     }
18     
19     public DellComputer(Cpu cpu,Memery mem,Disk disk){
20         this.cpu = cpu;
21         this.mem = mem;
22         this.disk = disk;
23     }
24     
25     //下面这两个方法都一样,都是统一调用了3个子系统的方法
26     @Override
27     public void turnOn() {
28         cpu.turnOn();
29         mem.turnOn();
30         disk.turnOn();
31     }
32 
33     @Override
34     public void shutdown() {
35         cpu.shutdown();
36         mem.shutdown();
37         disk.shutdown();
38     }
39 
40 }
View Code

    2.3.最后,来使用一下,创建一个用户 Tommy类:

1 package design.pattern.facade;
2 
3 public class Tommy {
4     public static void main(String[] args){
5         Computer com = new DellComputer();
6         com.turnOn();//开电脑,用户只需要按下开机按钮,CPU,内存,硬盘这些都会自动启动,而不需要用户操心
7         com.shutdown();//关机,同理,难道还得用户一个个的关么···
8     }
9 }
View Code

      运行结果:

      

3.小总结:

       3.1. 什么时候使用外观模式:

                   当用户仅关心调用的接口,而不关心内部运作时,可以尝试使用

       3.2. 优点:

                   使用了中介类嘛,稍微解耦了一下,不过也正因为这个中介类,导致了它不可避免的硬伤

       3.3. 缺点:

                   用户调用这边几乎没什么问题,关键是,当子系统类有变动时(新增、删除、或修改方法),中介类(外观类)必须做修改····

参考链接:http://www.cnblogs.com/dobetter/archive/2012/05/07/2488148.html 和 http://www.cnblogs.com/voidy/p/4234683.html

原文地址:https://www.cnblogs.com/tommy-huang/p/4284206.html