设计模式详解——复合模式

时间:2021-10-23
本文章向大家介绍设计模式详解——复合模式,主要包括设计模式详解——复合模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言

复合模式是指在一个解决方案中结合两个或多个模式,以解决一般或重发发生的问题。由于设计模式比较多,所以复合出来的复合模式就更多了,这里关于复合模式就不再展开分析了,下面我们来通过一种非常普遍的复合模式,来简单演示下复合模式的通常应用。

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时的那种兴奋感,但是退一步讲,关于本次的设计模式分享,我觉得自己还是有收获的:

首先我自己对设计模式有了整体的认知,在此之前,很多设计模式可能只知道它的名字,关于它的设计原理和基本思想,根本就不了解,但是学了这么几天之后,我觉得我已经发现了我们常用框架中的设计模式,同时也觉得要不断加强设计模式的实践,希望能真正将这些东西应用起来,这样坚持才有意义……

最后,用一句话结束今天的内容:坚持最大的意义就是坚持,坚持最大的动力也是坚持,愿你的愿望终能实现,愿你想去的地方终能到达,每一步都是起点,每一步都不是终点……大家共勉!感谢!晚安咯!

原文地址:https://www.cnblogs.com/caoleiCoding/p/15449806.html