設計模式詳解——複合模式
前言
複合模式是指在一個解決方案中結合兩個或多個模式,以解決一般或重發發生的問題。由於設計模式比較多,所以複合出來的複合模式就更多了,這裡關於複合模式就不再展開分析了,下面我們來通過一種非常普遍的複合模式,來簡單演示下複合模式的通常應用。
MVC模式
關於MVC
想必各位小夥伴絕對不陌生,凡是學過java web
相關內容的小夥伴,肯定都學過最基本的Model 2
的MVC
模式,也就是我們今天要分享的內容,下面是MVC
模式的模型圖:
其中Model
模型層就是我們存取的資料物件,View
試圖層表示需要呈現的試圖內容,Controller
控制器主要是用來操作模型和試圖的。
要點
MVC
是複合模式,結合了觀察者模式、策略模式和組合模式- 模型使用觀察者模式,以便觀察者更新,同時保持兩者之間的解耦
- 控制器是試圖的策略,試圖可以使用不同的控制器實現,得到不同的行為
- 檢視使用組合模式實現使用者介面,使用者介面通常組合了巢狀的元件,像面板、框架和按鈕等
- 這些模式攜手合作,把
MVC
模型的三次解耦,這樣既可以保持設計乾淨,又有彈性 - 介面卡模式用來將新的模型適配成已有的試圖和控制器
Model 2
是MVC
在Web
上的應用- 在
Mdodel 2
中,控制器實現成了Servlet
,而JSP/Html
是檢視層
示例
模型層
模型層通常採用觀察者模式,更準確地說是它和檢視層共同組成觀察者沒事,當資料資料模型發生變化時(被觀察物件),可以實時將結果反饋給檢視層(觀察者)。
使用觀察者模式,可以讓模型完全獨立於檢視和控制器,同一個模型可以使用不同的檢視,甚至可以使用多種檢視。
這裡我們的程式碼演示的是最基本的資料模型,也就是我們web
開發中的bean
:
public class StudentModel { private String rollNo; private String name; public String getRollNo() { return rollNo; } public void setRollNo(String rollNo) { this.rollNo = rollNo; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
檢視層
檢視層在某些場景下,是可能需要同時顯示多種資料模型和資料展示元件的,所以通常情況下檢視會是一個或多個元件構成,所以檢視層的實現是需要用到組合設計模式的。
這裡我們也僅僅演示一種最簡單的檢視模型,它主要用來列印模型的基本資訊:
public class StudentView {
public void printStudentDetails(String studentName, String studentRollNo){
System.out.println("Student: ");
System.out.println("Name: " + studentName);
System.out.println("Roll No: " + studentRollNo);
}
}
控制層
檢視層和控制器實現了經典的策略模式,檢視是一個物件,可以被調整使用不同的策略,而控制器提供了策略。檢視只關心繫統中可視的部分,對於任何邏輯行為,都委託給控制器處理。
使用策略模式也可以讓檢視和模型之間的關係解耦,因為控制器負責和模型互動來傳遞使用者的請求,對於實際請求數如何處理的,檢視並不需要關心。
這裡的控制層也很簡單,由控制層直接操作檢視和模型,然後完成相關操作:
public class StudentController {
private StudentModel model;
private StudentView view;
public StudentController(StudentModel model, StudentView view){
this.model = model;
this.view = view;
}
public void setStudentName(String name){
model.setName(name);
}
public String getStudentName(){
return model.getName();
}
public void setStudentRollNo(String rollNo){
model.setRollNo(rollNo);
}
public String getStudentRollNo(){
return model.getRollNo();
}
public void updateView(){
view.printStudentDetails(model.getName(), model.getRollNo());
}
}
測試程式碼
首先分別建立模型和檢視的示例,然後由控制器統一排程處理,最後檢視根據模型結果將資料予以展示:
@Test
public void testMVC() {
//從資料庫獲取學生記錄
StudentModel model = retrieveStudentFromDatabase();
//建立一個檢視:把學生詳細資訊輸出到控制檯
StudentView view = new StudentView();
StudentController controller = new StudentController(model, view);
controller.updateView();
//更新模型資料
controller.setStudentName("syske");
controller.updateView();
}
private static StudentModel retrieveStudentFromDatabase() {
StudentModel student = new StudentModel();
student.setName("雲中志");
student.setRollNo("10");
return student;
}
由於MVC
模式相比其他模式,我們都比較熟悉,所以這裡就不再過多說明了。
總結
今天其實在MVC
模式的示例中有點偷懶了,這一點我自己也明顯地感覺到了,設計模式確實學起來挺枯燥的,所以我在分析相關設計模式的時候,基本上都是按部就班的調調,內容上也是馬馬虎虎,整個過程根本就沒有我分享demo
時的那種興奮感,但是退一步講,關於本次的設計模式分享,我覺得自己還是有收穫的:
首先我自己對設計模式有了整體的認知,在此之前,很多設計模式可能只知道它的名字,關於它的設計原理和基本思想,根本就不瞭解,但是學了這麼幾天之後,我覺得我已經發現了我們常用框架中的設計模式,同時也覺得要不斷加強設計模式的實踐,希望能真正將這些東西應用起來,這樣堅持才有意義……
最後,用一句話結束今天的內容:堅持最大的意義就是堅持,堅持最大的動力也是堅持,願你的願望終能實現,願你想去的地方終能到達,每一步都是起點,每一步都不是終點……大家共勉!感謝!晚安咯!