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


前言

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

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時的那種興奮感,但是退一步講,關於本次的設計模式分享,我覺得自己還是有收獲的:

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM