国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP設(shè)計(jì)模式(六):MVC

時(shí)飛 / 2877人閱讀

摘要:原文地址設(shè)計(jì)模式六世紀(jì)年代,計(jì)算機(jī)發(fā)展迅速,編程技術(shù)也日益分化。到了年代,的出現(xiàn)更是讓這種程序設(shè)計(jì)模式得以延續(xù)。根據(jù)設(shè)計(jì)模式三封裝中介紹的設(shè)計(jì)原則,在面向?qū)ο蟪绦蛟O(shè)計(jì)中,類和類之間的訪問(wèn)交互和更新應(yīng)該是通過(guò)和。

原文地址:PHP設(shè)計(jì)模式(六):MVC

Introduction

20世紀(jì)80年代,計(jì)算機(jī)發(fā)展迅速,編程技術(shù)也日益分化。桌面應(yīng)用編程,也逐漸出現(xiàn)了用戶圖形界面和程序邏輯分離的程序設(shè)計(jì)。到了90年代,web的出現(xiàn)更是讓這種程序設(shè)計(jì)模式得以延續(xù)。
這種設(shè)計(jì)模式便是MVC(Model-View-Control),除了MVC,還有MVC的變種,如MVVM(Model-View-View Model)等。

MVC

回到80年代的桌面應(yīng)用編程,當(dāng)時(shí)面向?qū)ο蟮木幊淘O(shè)計(jì)模式(見(jiàn)PHP設(shè)計(jì)模式(一):基礎(chǔ)編程模式)興起,程序員將桌面應(yīng)用分割成兩個(gè)大的對(duì)象:領(lǐng)域?qū)ο?domain objects)和可視對(duì)象(presentation objects)。領(lǐng)域?qū)ο笫菍?duì)現(xiàn)實(shí)事物的抽象模型,可視對(duì)象是對(duì)用戶界面部分的抽象模型。
后來(lái)人們發(fā)現(xiàn),只有領(lǐng)域?qū)ο蠛涂梢晫?duì)象是不夠的,特別是在復(fù)雜的業(yè)務(wù)中。根據(jù)PHP設(shè)計(jì)模式(三):封裝中介紹的設(shè)計(jì)原則,在面向?qū)ο蟪绦蛟O(shè)計(jì)中,類和類之間的訪問(wèn)、交互和更新應(yīng)該是通過(guò)Accessors和Mutators。
那么如果操作領(lǐng)域?qū)ο竽兀咳藗円肓丝刂破?controller)的對(duì)象,通過(guò)控制器來(lái)操作領(lǐng)域模型。
到此,MVC模型逐漸穩(wěn)定下來(lái),用戶通過(guò)可視對(duì)象操作控制器對(duì)象,控制器對(duì)象再去操作領(lǐng)域?qū)ο蟆?/p> MVC中的設(shè)計(jì)模式

上面介紹的MVC屬于抽象度比較高的設(shè)計(jì)模式,在實(shí)際編程中,需要遵守下面的設(shè)計(jì)模式。

基于接口去編程

基于接口去編程的好處就是分離設(shè)計(jì)和實(shí)現(xiàn),這一點(diǎn)我們?cè)赑HP設(shè)計(jì)模式(二):抽象類和接口已經(jīng)介紹過(guò)了,下面我們舉一個(gè)實(shí)際的例子來(lái)說(shuō)明這個(gè)設(shè)計(jì)的好處。

eatFish()) {
      echo $this->name . " can eat fish.
";
    }
    if ($this->eatMoss()) {
      echo $this->name . " can eat moss.
";
    }
  }
}
?>

我們創(chuàng)建一個(gè)鯨魚(yú)類:

name = "Whale";
  }
  public function eatFish() {
    return TRUE;
  }
  public function eatMoss() {
    return FALSE;
  }
}

$whale = new Whale();
$whale->eat();
?>

運(yùn)行一下:

$ php Whale.php
Whale eats fish.

看上去沒(méi)什么問(wèn)題,對(duì)吧?我們創(chuàng)建一個(gè)鯉魚(yú)類:

name = "Carp";
  }
  public function eatMoss() {
    return TRUE;
  }
}

$carp = new Carp();
$carp->eat();
?>

運(yùn)行一下:

$ php Carp.php
PHP Fatal error: Class Carp contains 1 abstract method and must therefore be
declared abstract or implement the remaining method (Animal::eatFish) in
Carp.php on line 9

報(bào)錯(cuò)了,對(duì)吧?因?yàn)槲覀儗?shí)現(xiàn)Carp.php的時(shí)候故意沒(méi)有去實(shí)現(xiàn)eatFish接口,基于接口的編程設(shè)計(jì)模式可以在開(kāi)發(fā)期就發(fā)現(xiàn)這種邏輯錯(cuò)誤。

使用組件而不是繼承

將一個(gè)對(duì)象拆成更小的對(duì)象,這些小的對(duì)象成為組件(composition)。盡量使用組件而不是繼承的設(shè)計(jì)模式的意義在于,多種繼承之下,子類可能會(huì)擁有大量毫無(wú)意義的未實(shí)現(xiàn)方法。而通過(guò)組件的方式,子類可以選擇需要的組件。
下面給出一個(gè)例子:

eatFish()) {
      echo $this->name . " can eat fish.
";
    }
    if ($this->eatMoss()) {
      echo $this->name . " can eat moss.
";
    }
  }
}

class Whale extends Animal {
  protected function __construct() {
    $this->name = "Whale";
  }
  protected function eatFish() {
    return TRUE;
  }
  protected function eatMoss() {
    return FALSE;
  }
}

class BullWhale extends Whale {
  public function __construct() {
    $this->name = "Bull Whale";
  }
  public function getGender() {
    return "Male";
  }
}
?>

這里的BullWhale其實(shí)非常冗余,實(shí)際的業(yè)務(wù)模型可能并不需要這么復(fù)雜,這就是多重繼承的惡果。
而組件則不同,通過(guò)將行為拆分成不同的部分,又最終子類決定使用哪些組件。
下面給出一個(gè)例子:

name = $name;
  }
  public function eat($food) {
    echo $this->name . " eat ". $food . ".
";
  }
}

class Gender {
  private $gender;
  public function __construct($gender) {
    $this->gender= $gender;
  }
  public function getGender() {
    return $this->gender;
  }
}

class BullWhale {
  private $action;
  private $gender;
  public function __construct() {
    $this->action = new Action("Bull Whale");
    $this->gender = new Gender("Male");
  }
  public function eatFood($food) {
    $this->action->eat($food);
  }
  public function getGender() {
    return $this->gender->getGender();
  }
}

$bullWhale = new BullWhale();
$bullWhale->eatFood("fish");
echo $bullWhale->getGender() . "
";
?>

運(yùn)行一下:

$ php BullWhale.php
Bill Whale eat fish.
Male

BullWhale由Action和Gender組件構(gòu)成,不同的類可以選擇不同的組件組合,這樣就不會(huì)造成類冗余了。

Summary

實(shí)際編程中,更多的往往是混合架構(gòu),如既包含繼承,又包含組件的編程設(shè)計(jì)模式。不過(guò),掌握基本的編程架構(gòu)設(shè)計(jì)是一切的基礎(chǔ)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/21619.html

相關(guān)文章

  • PHP學(xué)習(xí)路線圖

    摘要:學(xué)習(xí)路線圖建議最后買(mǎi)一個(gè)域名和阿里云服務(wù)器,真正的將代碼部署到云服務(wù)器上去,走一次上線流程,用一下管理一下代碼會(huì)更棒。建議學(xué)習(xí)路線圖這個(gè)時(shí)候使用寫(xiě)一個(gè)大并發(fā)的多服務(wù)器的秒殺出來(lái)。 PHP學(xué)習(xí)路線圖 在網(wǎng)上很多人公布了太多的PHP學(xué)習(xí)路線圖,本人在互聯(lián)網(wǎng)公司工作十余年,也帶了很多PHP入門(mén)的新手,將他們的一些問(wèn)題和學(xué)習(xí)路線圖為大家整理出來(lái),希望很多小白少走彎路。 一、 網(wǎng)上某些錯(cuò)誤的學(xué)習(xí)...

    wapeyang 評(píng)論0 收藏0
  • 大前端2018現(xiàn)在上車還還得及么

    摘要:面向?qū)ο笕筇卣骼^承性多態(tài)性封裝性接口。第五階段封裝一個(gè)屬于自己的框架框架封裝基礎(chǔ)事件流冒泡捕獲事件對(duì)象事件框架選擇框架。核心模塊和對(duì)象全局對(duì)象,,,事件驅(qū)動(dòng),事件發(fā)射器加密解密,路徑操作,序列化和反序列化文件流操作服務(wù)端與客戶端。 第一階段: HTML+CSS:HTML進(jìn)階、CSS進(jìn)階、div+css布局、HTML+css整站開(kāi)發(fā)、 JavaScript基礎(chǔ):Js基礎(chǔ)教程、js內(nèi)置對(duì)...

    stormgens 評(píng)論0 收藏0
  • 大前端2018現(xiàn)在上車還還得及么

    摘要:面向?qū)ο笕筇卣骼^承性多態(tài)性封裝性接口。第五階段封裝一個(gè)屬于自己的框架框架封裝基礎(chǔ)事件流冒泡捕獲事件對(duì)象事件框架選擇框架。核心模塊和對(duì)象全局對(duì)象,,,事件驅(qū)動(dòng),事件發(fā)射器加密解密,路徑操作,序列化和反序列化文件流操作服務(wù)端與客戶端。 第一階段: HTML+CSS:HTML進(jìn)階、CSS進(jìn)階、div+css布局、HTML+css整站開(kāi)發(fā)、 JavaScript基礎(chǔ):Js基礎(chǔ)教程、js內(nèi)置對(duì)...

    mylxsw 評(píng)論0 收藏0
  • 從零開(kāi)始實(shí)現(xiàn)一個(gè)簡(jiǎn)易的Java MVC框架()--加強(qiáng)AOP功能

    摘要:在前面的文章中實(shí)現(xiàn)的功能時(shí),目標(biāo)類都只能被一個(gè)切面代理,如果想要生成第二個(gè)代理類,就會(huì)把之前的代理類覆蓋。改裝原有功能現(xiàn)在要改裝原來(lái)的的實(shí)現(xiàn)代碼,讓的功能加入到框架中為了讓切面能夠排序,先添加一個(gè)注解,用于標(biāo)記排序。 前言 在前面從零開(kāi)始實(shí)現(xiàn)一個(gè)簡(jiǎn)易的Java MVC框架(四)--實(shí)現(xiàn)AOP和從零開(kāi)始實(shí)現(xiàn)一個(gè)簡(jiǎn)易的Java MVC框架(五)--引入aspectj實(shí)現(xiàn)AOP切點(diǎn)這兩節(jié)文章...

    Loong_T 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<