外观模式

统一编程接口-外观模式

定义

要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式(Facade模式)提供一个高层次的接口,使得子系统更易于使用

使用场景

  1. 为一个复杂子系统提供一个简单接口。子系统往往因为不断演化而变得越来越复杂,甚至可能被替换。大多数模式使用时都会产生更多,更小的类,在这使子系统更具可重用行的同时也更容易对子系统进行定制、修改,这种易变性使得隐藏藏子系统的具体实现变得尤其重要。Facade可以提供一个简单统一的接口,对外隐藏子系统的具体实现、隔离变化;
  2. 当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让他们仅通过Facade接口进行通信,从而简化了他们之间的依赖关系。

简单示例

MobilePhone类:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package FacadeMode;

public class MobilePhone {
    private Phone mPhone=new PhoneImpl();
    private Camera mCamera=new CameraImpl();

    public void dail(){
        mPhone.dail();
    }

    public void videoChat(){
        System.out.println("==>视频通话连接中");
        mCamera.open();
        mPhone.dail();
    }

    public void hangup(){
        mPhone.hangup();
    }

    public void takePicture(){
        mCamera.open();
        mCamera.takePicture();
    }

    public void closeCamera(){
        mCamera.close();
    }
}

Phone接口:

1
2
3
4
5
6
package FacadeMode;

public interface Phone {
    public void dail();
    public void hangup();
}

PhoneImpl:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package FacadeMode;

public class PhoneImpl implements Phone {
    public void dail() {
        System.out.println("打电话");
    }

    public void hangup() {
        System.out.println("挂断");
    }
}

Camera接口:

1
2
3
4
5
6
7
package FacadeMode;

public interface Camera {
    public void open();
    public void takePicture();
    public void close();
}

CameraImpl:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package FacadeMode;

public class CameraImpl implements Camera {
    public void open() {
        System.out.println("打开相机");
    }

    public void takePicture() {
        System.out.println("拍照");
    }

    public void close() {
        System.out.println("关闭相机");
    }
}

测试类:

1
2
3
4
5
6
7
8
9
package FacadeMode;

public class Test {
    public static void main(String[] args) {
        MobilePhone mobilePhone=new MobilePhone();
        mobilePhone.takePicture();
        mobilePhone.videoChat();
    }
}

输出结果:

142.png

总结:

优点

  1. 对客户程序隐藏子系统细节,因而减少了客户对子系统的耦合,能够拥抱变化
  2. 外观类对子系统的接口封装,使得系统更易于使用

缺点

  1. 外观类接口膨胀。由于子系统的接口都有外观类统一对外暴露,使得外观类的API接口较多,在一定程度上增加了用户使用成本
  2. 外观类没有遵循开闭原则,当业务出现变更时,可能需要直接修改外观类