1. 程式人生 > 其它 >設計模式詳解——複合模式

設計模式詳解——複合模式

前言

複合模式是指在一個解決方案中結合兩個或多個模式,以解決一般或重發發生的問題。由於設計模式比較多,所以複合出來的複合模式就更多了,這裡關於複合模式就不再展開分析了,下面我們來通過一種非常普遍的複合模式,來簡單演示下複合模式的通常應用。

MVC模式

關於MVC想必各位小夥伴絕對不陌生,凡是學過java web相關內容的小夥伴,肯定都學過最基本的Model 2MVC模式,也就是我們今天要分享的內容,下面是MVC模式的模型圖:

其中Model模型層就是我們存取的資料物件,View試圖層表示需要呈現的試圖內容,Controller控制器主要是用來操作模型和試圖的。

要點

  • MVC是複合模式,結合了觀察者模式、策略模式和組合模式
  • 模型使用觀察者模式,以便觀察者更新,同時保持兩者之間的解耦
  • 控制器是試圖的策略,試圖可以使用不同的控制器實現,得到不同的行為
  • 檢視使用組合模式實現使用者介面,使用者介面通常組合了巢狀的元件,像面板、框架和按鈕等
  • 這些模式攜手合作,把MVC模型的三次解耦,這樣既可以保持設計乾淨,又有彈性
  • 介面卡模式用來將新的模型適配成已有的試圖和控制器
  • Model 2MVCWeb上的應用
  • 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時的那種興奮感,但是退一步講,關於本次的設計模式分享,我覺得自己還是有收穫的:

首先我自己對設計模式有了整體的認知,在此之前,很多設計模式可能只知道它的名字,關於它的設計原理和基本思想,根本就不瞭解,但是學了這麼幾天之後,我覺得我已經發現了我們常用框架中的設計模式,同時也覺得要不斷加強設計模式的實踐,希望能真正將這些東西應用起來,這樣堅持才有意義……

最後,用一句話結束今天的內容:堅持最大的意義就是堅持,堅持最大的動力也是堅持,願你的願望終能實現,願你想去的地方終能到達,每一步都是起點,每一步都不是終點……大家共勉!感謝!晚安咯!