前言
復合模式是指在一個解決方案中結合兩個或多個模式,以解決一般或重發發生的問題。由於設計模式比較多,所以復合出來的復合模式就更多了,這里關於復合模式就不再展開分析了,下面我們來通過一種非常普遍的復合模式,來簡單演示下復合模式的通常應用。
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時的那種興奮感,但是退一步講,關於本次的設計模式分享,我覺得自己還是有收獲的:
首先我自己對設計模式有了整體的認知,在此之前,很多設計模式可能只知道它的名字,關於它的設計原理和基本思想,根本就不了解,但是學了這么幾天之后,我覺得我已經發現了我們常用框架中的設計模式,同時也覺得要不斷加強設計模式的實踐,希望能真正將這些東西應用起來,這樣堅持才有意義……
最后,用一句話結束今天的內容:堅持最大的意義就是堅持,堅持最大的動力也是堅持,願你的願望終能實現,願你想去的地方終能到達,每一步都是起點,每一步都不是終點……大家共勉!感謝!晚安咯!
