案例分析:设计模式与代码的结构特性

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。

模型(Model):用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“Model”有对数据直接访问的权力,例如对数据库的访问。“Model”不依赖“View”和“Controller”,也就是说, Model 不关心它会被如何显示或是如何被操作。但是 Model 中数据的变化一般会通过一种刷新机制被公布。为了实现这种机制,那些用于监视此 Model 的 View 必须事先在此 Model 上注册,由此,View 可以了解在数据 Model 上发生的改变。(比如:观察者模式(软件设计模式));

视图(View):能够实现数据有目的的显示(理论上,这不是必需的)。在 View 中一般没有程序上的逻辑。为了实现 View 上的刷新功能,View 需要访问它监视的数据模型(Model),因此应该事先在被它监视的数据那里注册;

控制器(Controller):起到不同层面间的组织作用,用于控制应用程序的流程。它处理事件并作出响应。“事件”包括用户的行为和数据 Model 上的改变。

   

 

 

优点:

1、分工明确(开发人员可以只关注整个结构中的其中某一层):使用MVC可以把数据库开发,程序业务逻辑开发,页面开发分开,每一层都具有相同的特征,方便以后的代码维护。它使程序员(Java开发人员)集中精力于业务逻辑,界面程序员(HTML和JSP开发人员)集中精力于表现形式上。

2、松耦合(可以降低层与层之间的依赖):视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。因为模型与控制器和视图相分离,所以很容易改变应用程序的数据层和业务规则。

3、复用性高(利于各层逻辑的复用):像多个视图能够共享一个模型,不论你视图层是用flash界面或是wap界面,用一个模型就能处理他们。将数据和业务规则从表示层分开,就可以最大化从用代码。、

4、有利于标准化(有利于通过工程化、工具化产生管理程序代码);

概括来说,分层式设计可以达至如下目的:分散关注、松散耦合、逻辑复用、标准定义。

缺点:

分层式结构也不可避免具有一些缺陷:

1、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。

2、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。

3、由于它没有明确的定义,所以完全理解MVC并不是很容易。使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考。

4、MVC并不适合小型甚至中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。

下面是一个MVC模式的例子,创建一个作为模型的 Student 对象,StudentView 是一个把学生详细信息输出到控制台的视图类,StudentController 是负责存储数据到 Student 对象中的控制器类,并相应地更新视图 StudentView。

 

创建模型。

Student.java

public class Student {

   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;

   }

}

 

创建视图。

StudentView.java

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);

   }

}

 

创建控制器。

StudentController.java

public class StudentController {

   private Student model;

   private StudentView view;

   public StudentController(Student 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());

   } 

}

 

使用 StudentController 方法来演示 MVC 设计模式的用法。

MVCPatternDemo.java

public class MVCPatternDemo {

   public static void main(String[] args) {

      //从数据库获取学生记录

      Student model  = retrieveStudentFromDatabase();

      //创建一个视图:把学生详细信息输出到控制台

      StudentView view = new StudentView();

      StudentController controller = new StudentController(model, view);

      controller.updateView();

      //更新模型数据

      controller.setStudentName("Bob");

      controller.updateView();

   }

 

   private static Student retrieveStudentFromDatabase(){

      Student student = new Student();

      student.setName("Alice");

      student.setRollNo("1");

      return student;

   }

}

 

posted on 2019-12-08 16:24  T,T  阅读(171)  评论(0编辑  收藏  举报

导航