外观模式

介绍

外观模式的使用频率非常的高,尤其是先阶段各种SDK满天飞,而这些SDK很大概率上会使用外观模式。通过一个外观类使得系统的接口只有一个统一的高层的接口,这样能够降低用户的使用的成本,也对用户屏蔽了很多的实现细节。当然在我们的开发过程中外观模式也是我们封装API的常用的手段,例如网络模块,ImageLoader模块等。

使用场景

当你需要构建一个层次结构的子系统的时候,使用外观模式定义子系统每层的入口点,如果子系统之间是相互依赖的,你可以让他们仅通过高层的接口进行通信,从而简化了他们之间的依赖的关系。

为一个复杂的子系统提供一个简单的接口。子系统往往因为不断的演化而变得越来越复杂,甚至可能被逼换掉。大多数模式使用的时候,都会产生更多更小的类,使用外观模式,使得子系统更具可重用性的同时也更容易对子系统进行定制,修改,这种易变性使得隐藏子系统的具体行为,变得尤其重要。外观模式可以提供一个简单统一的接口,对外隐藏子系统的具体实现,隔离变化。

简单实现

任何一个类似中央调度结构的组织都类似外观模式。例如手机,可以拍照,打电话,上网。手机给你提供了一个统一的入口,集拍照,打电话,上网于一身,操作简单,使用方便。

抽象电话

1
2
3
4
5
6
7
public interface Phone {

public void dail();

public void hangup();

}

具体的电话

1
2
3
4
5
6
7
8
9
10
11
12
public class PhoneImp implements Phone {

@Override
public void dail() {
System.out.println("打电话");
}

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

抽象的相机

1
2
3
4
5
public interface Camera {
public void open();
public void takePicture();
public void close();
}

具体的相机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class CameraImp implements Camera {

@Override
public void open() {
System.out.println("打开相机");
}

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

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

手机

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
30
public class MobilePhone {

private Phone phone = new PhoneImp();
private Camera camera = new CameraImp();

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

public void videoChat(){

System.out.println("视频聊天通话中");
camera.open();
phone.dail();
}

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

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

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

}

客户端

1
2
3
4
5
6
7
8
9
public static void main(String[] args){

MobilePhone mobilePhone = new MobilePhone();
//拍照
mobilePhone.takePicture();
//视频聊天
mobilePhone.videoChat();

}

外观模式就是同一接口封装。将子系统的逻辑,交互隐藏起来,为用户提供一个高层次的接口,使得系统更加易用,同时也对外隐藏了具体的实现,这样即使具体的子系统发生了变化,用户也不会感知到,因为用户使用的高层接口,内部的变化对于用户来说不可见。这样一来就讲变化,隔离开来,使得系统更加的灵活。

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器