zoukankan      html  css  js  c++  java
  • 设计模式详解——复合模式

    前言

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

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

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

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

  • 相关阅读:
    面试问题整理Andorid版本 date: 2017-1-12 21:14:36 categories: 技术
    轻量级的C++插件框架
    C++程序在Windows平台上各种定位内存泄漏的方法,并对比了它们的优缺点
    Facebook App 的头文件会有更多的收获
    合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友_python
    使用python在校内发人人网状态(人人网看状态)_python
    使用PYTHON创建XML文档_python
    优秀的缓存请求库,快速请求接口和图片:WTRequestCenter
    让读者快速了解RocketMQ消息中间件需要解决哪些问题
    编绎调试HotSpot JVM及在Eclipse里调试HotSpot一些步骤
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/15449806.html
Copyright © 2011-2022 走看看