设计模式详解——复合模式
前言
复合模式是指在一个解决方案中结合两个或多个模式,以解决一般或重发发生的问题。由于设计模式比较多,所以复合出来的复合模式就更多了,这里关于复合模式就不再展开分析了,下面我们来通过一种非常普遍的复合模式,来简单演示下复合模式的通常应用。
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
时的那种兴奋感,但是退一步讲,关于本次的设计模式分享,我觉得自己还是有收获的:
首先我自己对设计模式有了整体的认知,在此之前,很多设计模式可能只知道它的名字,关于它的设计原理和基本思想,根本就不了解,但是学了这么几天之后,我觉得我已经发现了我们常用框架中的设计模式,同时也觉得要不断加强设计模式的实践,希望能真正将这些东西应用起来,这样坚持才有意义……
最后,用一句话结束今天的内容:坚持最大的意义就是坚持,坚持最大的动力也是坚持,愿你的愿望终能实现,愿你想去的地方终能到达,每一步都是起点,每一步都不是终点……大家共勉!感谢!晚安咯!
- END -