文章優先發表在個人博客,後續如果更新忘記同步抱歉。
個人博客本篇文章地址:https://www.xdx97.com/article/707951089365811200
一、引出外觀模式
比如我們要弄一個電影院,裏面有幕布、投影儀、摺疊椅等。
開始:放下幕布、打開投影儀、打開摺疊椅
中間:開始播放
結束:關閉幕布、關閉投影儀、關閉摺疊椅
設計這個系統
1、我們可以把幕布、投影儀、摺疊椅,看成一個小的系統,它裏面又有具體的相關操作。
2、我們有一個客戶端,比如開始的時候。我們就去調用幕布的打開方法,投影儀的打開方法,摺疊椅的打開方法。
3、同理我們的中間、結束也都是調用相對應的操作方法。
這樣存在一個問題就是:
- 客戶端調用起來麻煩
- 當開始過程新增了一個操作,客戶端也要對應的去做出改變。
- 圖示就是這樣,我們用戶直接進行相對應的操作
二、外觀模式
外觀模式理解起來很簡單,就是我們對其提出一個操作類,讓用戶去操作我們的操作類。不讓其直接使用對應的方法。在上面的例子中,用戶只需要知道我們有三個方法就好了。開始、中間、結束至於這裏面具體的操作我們用戶不需要知道。
注:幕布、投影儀、摺疊椅都是使用單例模式進行構造
Curtain(幕布)
public class Curtain {
private Curtain(){}
private static final Curtain curtain = new Curtain();
public static Curtain getCurtain(){
return curtain;
}
// 打開幕布
public void openCurtain(){
System.out.println("打開幕布....");
}
// 打開幕布
public void closeCurtain(){
System.out.println("關閉幕布....");
}
}
Projector(投影儀)
public class Projector {
private Projector(){}
private static final Projector projector = new Projector();
public static Projector getProjector(){
return projector;
}
// 打開投影儀
public void openProjector(){
System.out.println("打開投影儀....");
}
// 開始播放
public void startPlaying(){
System.out.println("開始播放....");
}
// 打開投影儀
public void closeProjector(){
System.out.println("關閉投影儀....");
}
}
FoldingChair (摺疊椅)
public class FoldingChair {
private FoldingChair(){}
private static final FoldingChair foldingChair = new FoldingChair();
public static FoldingChair getFoldingChair(){
return foldingChair;
}
// 打開投影儀
public void openFoldingChair(){
System.out.println("打開摺疊椅....");
}
// 打開投影儀
public void closeFoldingChair(){
System.out.println("關閉摺疊椅....");
}
}
movie (電影 我們的中間層)
public class Movie {
private Curtain curtain = Curtain.getCurtain();
private FoldingChair foldingChair = FoldingChair.getFoldingChair();
private Projector projector = Projector.getProjector();
// 開始
public void start(){
// 打開幕布
curtain.openCurtain();
// 打開投影儀
projector.openProjector();
// 打開摺疊椅
foldingChair.openFoldingChair();
}
// 中間
public void middle(){
projector.startPlaying();
}
// 結束
public void end(){
// 打開幕布
curtain.closeCurtain();
// 打開投影儀
projector.closeProjector();
// 打開摺疊椅
foldingChair.closeFoldingChair();
}
}
測試
public class Main {
public static void main(String[] args) {
Movie movie = new Movie();
// 開始
movie.start();
// 中間
movie.middle();
// 結束
movie.end();
}
}
總結
- 關於外觀模式我們很容易就去理解了。就是套一個殼子嘛
- 當了我們學一個東西要靈活的運用。如果我們的底層系統就是隻有一個。那麼我們還需要中間層嘛?