美文网首页
从零开始学设计模式(6):MVC

从零开始学设计模式(6):MVC

作者: 小甲鱼python | 来源:发表于2017-06-15 09:52 被阅读10次

Introduction

20世纪80年代,计算机发展迅速,编程技术也日益分化。桌面应用编程,也逐渐出现了用户图形界面和程序逻辑分离的程序设计。到了90年代,web的出现更是让这种程序设计模式得以延续。

这种设计模式便是MVC(Model-View-Control),除了MVC,还有MVC的变种,如MVVM(Model-View-View Model)等。

MVC

回到80年代的桌面应用编程,当时面向对象的编程设计模式(见PHP设计模式(一):基础编程模式)兴起,程序员将桌面应用分割成两个大的对象:领域对象(domain objects)和可视对象(presentation objects)。领域对象是对现实事物的抽象模型,可视对象是对用户界面部分的抽象模型。

后来人们发现,只有领域对象和可视对象是不够的,特别是在复杂的业务中。根据PHP设计模式(三):封装中介绍的设计原则,在面向对象程序设计中,类和类之间的访问、交互和更新应该是通过Accessors和Mutators。

那么如果操作领域对象呢?人们引入了控制器(controller)的对象,通过控制器来操作领域模型。

到此,MVC模型逐渐稳定下来,用户通过可视对象操作控制器对象,控制器对象再去操作领域对象。

MVC中的设计模式

上面介绍的MVC属于抽象度比较高的设计模式,在实际编程中,需要遵守下面的设计模式。

基于接口去编程

基于接口去编程的好处就是分离设计和实现,这一点我们在PHP设计模式(二):抽象类和接口已经介绍过了,下面我们举一个实际的例子来说明这个设计的好处。

abstractclassAnimal{

protected$name;

abstractprotectedfunctioneatFish();

abstractprotectedfunctioneatMoss();

publicfunctioneat(){

if($this->eatFish()){

echo $this->name." can eat fish.\n";

}

if($this->eatMoss()){

echo $this->name." can eat moss.\n";

}

}

}

?>

我们创建一个鲸鱼类:

include_once('Animal.php');

classWhaleextendsAnimal{

publicfunction__construct(){

$this->name="Whale";

}

publicfunctioneatFish(){

returnTRUE;

}

publicfunctioneatMoss(){

returnFALSE;

}

}

$whale=newWhale();

$whale->eat();

?>

运行一下:

$ php Whale.php

Whale eats fish.

看上去没什么问题,对吧?我们创建一个鲤鱼类:

include_once('Animal.php');

classCarpextendsAnimal{

publicfunction__construct(){

$this->name="Carp";

}

publicfunctioneatMoss(){

returnTRUE;

}

}

$carp=newCarp();

$carp->eat();

?>

运行一下:

$ phpCarp.php

PHPFatalerror:ClassCarpcontains1abstractmethodandmust therefore be

declaredabstractorimplement the remaining method(Animal::eatFish)in

Carp.php on line9

报错了,对吧?因为我们实现Carp.php的时候故意没有去实现eatFish接口,基于接口的编程设计模式可以在开发期就发现这种逻辑错误。

使用组件而不是继承

将一个对象拆成更小的对象,这些小的对象成为组件(composition)。尽量使用组件而不是继承的设计模式的意义在于,多种继承之下,子类可能会拥有大量毫无意义的未实现方法。而通过组件的方式,子类可以选择需要的组件。

下面给出一个例子:

abstractclassAnimal{

protected$name;

abstractprotectedfunctioneatFish();

abstractprotectedfunctioneatMoss();

publicfunctioneat(){

if($this->eatFish()){

echo $this->name." can eat fish.\n";

}

if($this->eatMoss()){

echo $this->name." can eat moss.\n";

}

}

}

classWhaleextendsAnimal{

protectedfunction__construct(){

$this->name="Whale";

}

protectedfunctioneatFish(){

returnTRUE;

}

protectedfunctioneatMoss(){

returnFALSE;

}

}

classBullWhaleextendsWhale{

publicfunction__construct(){

$this->name="Bull Whale";

}

publicfunctiongetGender(){

return"Male";

}

}

?>

这里的BullWhale其实非常冗余,实际的业务模型可能并不需要这么复杂,这就是多重继承的恶果。

而组件则不同,通过将行为拆分成不同的部分,又最终子类决定使用哪些组件。

下面给出一个例子:

classAction{

private$name;

publicfunction__construct($name){

$this->name=$name;

}

publicfunctioneat($food){

echo $this->name." eat ".$food.".\n";

}

}

classGender{

private$gender;

publicfunction__construct($gender){

$this->gender=$gender;

}

publicfunctiongetGender(){

return$this->gender;

}

}

classBullWhale{

private$action;

private$gender;

publicfunction__construct(){

$this->action=newAction("Bull Whale");

$this->gender=newGender("Male");

}

publicfunctioneatFood($food){

$this->action->eat($food);

}

publicfunctiongetGender(){

return$this->gender->getGender();

}

}

$bullWhale=newBullWhale();

$bullWhale->eatFood("fish");

echo $bullWhale->getGender()."\n";

?>

运行一下:

$ phpBullWhale.php

BillWhaleeat fish.

Male

BullWhale由Action和Gender组件构成,不同的类可以选择不同的组件组合,这样就不会造成类冗余了。

Summary

实际编程中,更多的往往是混合架构,如既包含继承,又包含组件的编程设计模式。不过,掌握基本的编程架构设计是一切的基础。

如果你觉得眼前需要更好的提高你可以来千锋学PHP,国内排名第一的PHP机构。

相关文章

  • 从零开始学设计模式(6):MVC

    Introduction 20世纪80年代,计算机发展迅速,编程技术也日益分化。桌面应用编程,也逐渐出现了用户图形...

  • 游戏开发中的MVVM设计模式

    mvc设计模式 说到mvvm设计模式不得不先说说mvc设计模式。mvc其实不是一个模式,而是几个模式结合使用的结果...

  • 浅析 MVC

    一、 MVC 设计模式 1. 设计模式 设计模式,是通用代码(组织方式)的一种统称 2. MVC 是什么 MVC ...

  • iOS开发之MVVM+RAC架构模式

    在说MVVM之前,首先要了解我们最常用的MVC设计模式⬇️ 1.MVC设计模式 苹果官方将MVC设计模式作为iOS...

  • 浅析 MVC

    一、MVC是什么? MVC是一种设计模式(那设计模式又是什么呢?简单粗暴的说好用的东西就是设计模式),MVC能够使...

  • 对angularJS一些概念的理解

    angularJS是以MVC为设计模式的JS框架 MVC(Model View Controller)设计模式(d...

  • 面试题总结(二)

    常用的设计模式:MVC、工厂、代理、KVO MVC设计模式 MVC是一种架构模式,M表示数据模型Model,V表示...

  • JavaWeb入门——MVC

    1.MVC设计模式 1.1MVC模式 1.2MVC模式示例 index.jsp WelcomeServlet.ja...

  • iOS 设计模式 一

    设计模式随记 系统架构模式 1. MVC - MVVM - MVP - MVVM、MVC协调版 MVC :...

  • ASP.NET Core开发异常页面

    目录 本文出自《从零开始学 ASP.NET CORE MVC》目录 视频课程效果更佳:从零开始学 Asp.Net...

网友评论

      本文标题:从零开始学设计模式(6):MVC

      本文链接:https://www.haomeiwen.com/subject/rysyqxtx.html