1.前言
外觀模式使用頻率很高。
2.定義
外觀模式(Facade):爲子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用。
3.UML圖
4.使用場景
(1)爲一個複雜子系統提供一個簡單接口。
(2)需要構建一個層次結構的子系統時,使用Facade模式定義子系統中每層的入口點。如果子系統之間是相互依賴的,可以讓他們僅通過Facade接口進行通信,簡化它們之間的依賴關係。
5.簡單實例
public class MobilePhone {
private Phone phone = new PhoneImpl();
private Camera camera = new CameraImpl();
public void dail(){
phone.dial();
}
public void videoChat(){
Log.i("zsf","視頻接通中...");
camera.open();
phone.dial();
}
public void hangup(){
phone.hangup();
}
public void takePicture(){
camera.open();
camera.takePicture();
}
public void closeCamera(){
camera.close();
}
}
public interface Phone {
void dial();//打電話
void hangup();//掛斷
}
public interface Camera {
void open();//打開攝像頭
void close();//關閉攝像頭
void takePicture();
}
public class PhoneImpl implements Phone {
@Override
public void dial() {
Log.i("zsf","打電話");
}
@Override
public void hangup() {
Log.i("zsf", "掛斷電話");
}
}
public class CameraImpl implements Camera {
@Override
public void open() {
Log.i("zsf","打開攝像頭");
}
@Override
public void close() {
Log.i("zsf","關閉攝像頭");
}
@Override
public void takePicture() {
Log.i("zsf","拍攝照片");
}
}
public class FacadeTestActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MobilePhone mobilePhone = new MobilePhone();
mobilePhone.takePicture();
mobilePhone.videoChat();
}
}
輸出如下:
06-24 22:05:12.124 23811-23811/? I/zsf: 打開攝像頭
06-24 22:05:12.124 23811-23811/? I/zsf: 拍攝照片
06-24 22:05:12.124 23811-23811/? I/zsf: 視頻接通中...
06-24 22:05:12.124 23811-23811/? I/zsf: 打開攝像頭
06-24 22:05:12.124 23811-23811/? I/zsf: 打電話
5.總結
外觀模式的精髓就在於封裝。通過一個高層次結構爲用戶提供統一的API入口,使用戶通過一個類型就可以操作這個系統。