真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PHP的設(shè)計模式

什么是設(shè)計模式:

 

成都創(chuàng)新互聯(lián)專注于會寧企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城開發(fā)。會寧網(wǎng)站建設(shè)公司,為會寧等地區(qū)提供建站服務(wù)。全流程按需設(shè)計網(wǎng)站,專業(yè)設(shè)計,全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)

設(shè)計模式就是一個教你如何利用真實(shí)可靠的設(shè)計來組織你的代碼的模板。

 

所有的設(shè)計模式都有一些常用的特性:一個標(biāo)識(a name),一個問題陳述(a problem statement)和一個解決方案(a solution)。

 

1、一個設(shè)計模式的標(biāo)識是重要的,因?yàn)樗鼤屍渌某绦騿T不用進(jìn)行太深入的學(xué)習(xí)就能立刻理解你的代碼的目的(至少通過這個標(biāo)識程序員會很熟悉這個模式)。

2、問題描述是用來說明這個模式的應(yīng)用的領(lǐng)域。

3、解決方案描述了這個模型的執(zhí)行。一個好的設(shè)計模式的論述應(yīng)該覆蓋使用這個模型的優(yōu)點(diǎn)和缺點(diǎn)。

 

比如,你從店鋪里面買的一件襯衫是一個代碼庫,它的顏色,樣式和大小都由設(shè)計師和廠商決定,但它滿足了你的需求。然而,如果店里面沒有什么衣服適合你,那你就能自己創(chuàng)建自己的襯衫(設(shè)計它的形狀,選擇布料,然后裁縫在一起)。但是如果你不是一個裁縫,你可能會發(fā)現(xiàn)自己很容易的去找一個合適的模式然后按著這個模式去設(shè)計自己的襯衫。使用一個模型,你可以在更少的時間內(nèi)得到一個熟練設(shè)計的襯衫。

 

 

 

 

php一共有傳統(tǒng)的23種設(shè)計模式,

 

Interpreter(解釋器模式),F(xiàn)actory(工廠模式),F(xiàn)acade(外觀模式),Decorator(裝飾模式),Builder(建造者模式)

 

Adapter(適配器模式),Template (模板模式),Command(命令鏈模式),Singleton(單例模式),Observer(觀察者模式)

 

Strategy(策略模式),Visitor (訪問者模式),Memento (備忘錄模式),Prototype (原型模式),Mediator (中介者模式)

 

FlyWeight (享元模式),Chain Of Responsibility (職責(zé)鏈模式),Bridge (橋接模式),Proxy (代理模式),State (狀態(tài)模式)

 

Composite (組合模式),Interator (迭代器模式),DAO(數(shù)據(jù)訪問對象模式),Delegation(委托模式)

 

 

 

 

 

 

其中有五種php常見的設(shè)計模式

1.工廠模式 2.單例模式(單元素模式)3.觀察者模式 4.命令鏈模式 5.策略模式

 

 

什么是耦合:

  耦合性(Coupling),也叫耦合度,是對模塊間關(guān)聯(lián)程度的度量。耦合的強(qiáng)弱取決與模塊間接口的復(fù)雜性、調(diào)用模塊的方式以及通過界面?zhèn)魉蛿?shù)據(jù)的多少。模塊間的耦合度是指模塊之間的依賴關(guān)系,包括控制關(guān)系、調(diào)用關(guān)系、數(shù)據(jù)傳遞關(guān)系。模塊間聯(lián)系越多,其耦合性越強(qiáng),同時表明其獨(dú)立性越差。軟件設(shè)計中通常用耦合度和內(nèi)聚度作為衡量模塊獨(dú)立程度的標(biāo)準(zhǔn)。劃分摸塊的一個準(zhǔn)則就是高內(nèi)聚低耦合

 

 

 

 

工廠模式:

 

工廠模式的最大優(yōu)點(diǎn)在于創(chuàng)建對象上面,就是把創(chuàng)建對象的過程封裝起來,這樣隨時可以產(chǎn)生一個新的對象。

 

減少代碼進(jìn)行復(fù)制粘帖,耦合關(guān)系重,牽一發(fā)動其他部分代碼。

通俗的說,以前創(chuàng)建一個對象要使用new,現(xiàn)在把這個過程封裝起來了。

假設(shè)不使用工廠模式:那么很多地方調(diào)用類a,代碼就會這樣子創(chuàng)建一個實(shí)例:new a(),假設(shè)某天需要把a(bǔ)類的名稱修改,意味著很多調(diào)用的代碼都要修改。

建立一個工廠(一個函數(shù)或一個類方法)來制造新的對象,它的任務(wù)就是把對象的創(chuàng)建過程都封裝起來,

創(chuàng)建對象不是使用new的形式了。而是定義一個方法,用于創(chuàng)建對象實(shí)例。

 

    工廠方法:

比如你的工廠叫做“香煙工廠”,那么可以有“七匹狼工廠”“中華工廠”等,但是,這個工廠只生廠一種商品:香煙;

 

抽象工廠:無法描述它到底生產(chǎn)什么產(chǎn)品,它生產(chǎn)很多類型的產(chǎn)品(所以抽象工廠就會生成子工廠)。

 

你的工廠是綜合型的,是生產(chǎn)“一系列”產(chǎn)品,而不是“一個”,比如:生產(chǎn)“香煙”,還有“啤酒”等。然后它也可以有派生出來的具體的工廠,但這些工廠都是生產(chǎn)這一系列產(chǎn)品,只是可能因?yàn)榈赜虿灰粯樱瑸榱诉m應(yīng)當(dāng)?shù)厝丝谖?,味道也不太一樣?/p>

 

工廠模式:理解成只生成一種產(chǎn)品的工廠。比如生產(chǎn)香煙的。

 

工廠方法:工廠的一種產(chǎn)品生產(chǎn)線 。比如鍵盤的生成過程。

 

< php

/**

 * 工廠方法模式

 *

 * 定義一個用于創(chuàng)建對象的接口,讓子類決定將哪一個類實(shí)例化,使用一個類的實(shí)例化延遲到其子類

*/

 

/*

class DBFactory

{

    public static function create($type)

    {

        swtich($type)

        {

            case "MySQL":

                return new MysqlDB(); break;

            case "Postgre":

                return new PostgreDB(); break;

            case "Mssql":

                return new MssqlDB(); break;

        }

    }

}

*/

class DBFactory

{

  publicstaticfunction create($type)

    {

  $class=$type."DB";

  returnnew$class;

    }

}

 

interface DB

{

  publicfunction connect();

  publicfunctionexec();

}

 

class MysqlDB implements DB

{

  publicfunction __construct() {

  echo"mysql db
";

    }

 

  publicfunction connect() {

    }

 

  publicfunctionexec() {

    }

}

 

class PostgreDB implements DB

{

  publicfunction __construct() {

  echo"Postgre db
";

    }

 

  publicfunction connect() {

  }

 

  publicfunctionexec() {

     } 

 

class MssqlDB implements DB

{

  publicfunction __construct() {

  echo"mssql db
";

    }

 

  publicfunction connect() {

    }

  publicfunctionexec() {

    }

}

 

 

$oMysql= DBFactory::create("Mysql");

$oPostgre= DBFactory::create("Postgre");

$oMssql= DBFactory::create("Mssql");

 

 

 

 

 

 

單例模式:

 

作為對象的創(chuàng)建模式,單例模式確保某一個類只有一個實(shí)例,而且自行實(shí)例化并向整個系統(tǒng)全局地提供這個實(shí)例。它不會創(chuàng)建實(shí)例副本,而是會向單例類內(nèi)部存儲的實(shí)例返回一個引用。

 

(1). 需要一個保存類的唯一實(shí)例的靜態(tài)成員變量:private static $_instance; 

 

(2). 構(gòu)造函數(shù)和克隆函數(shù)必須聲明為私有的,防止外部程序new類從而失去單例模式的意義:

private function __construct()   

{   

    $this->_db = pg_connect('xxxx');  

}   

private function __clone()

}

 

(3). 必須提供一個訪問這個實(shí)例的公共的靜態(tài)方法(通常為getInstance方法),從而返回唯一實(shí)例的一個引用:

public static function getInstance()    

{    

    if(! (self::$_instance instanceof self) )   

    {    

        self::$_instance = new self();    

    }  

    return self::$_instance;    

  

 

 

 

為什么要使用PHP單例模式?

 

1、php的應(yīng)用主要在于數(shù)據(jù)庫應(yīng)用, 所以一個應(yīng)用中會存在大量的數(shù)據(jù)庫操作, 使用單例模式, 則可以避免大量的new 操作消耗的資源。

 

2、如果系統(tǒng)中需要有一個類來全局控制某些配置信息, 那么使用單例模式可以很方便的實(shí)現(xiàn). 

 

 

 

 

 

觀察者模式:

  觀察者模式定義對象的 一對多 依賴,這樣一來,當(dāng)一個對象改變狀態(tài)時,它的所有依賴者都會收到通知并自動更新!

  在觀察者模式中,會改變的是主題的狀態(tài)以及觀察者的數(shù)目。用這個模式,你可以改變依賴于主題狀態(tài)的對象,卻不必改變主題?!页龀绦蛑袝兓姆矫妫缓髮⑵浜凸潭ú蛔兊姆矫嫦喾蛛x!

 

 

  主題和觀察者都使用接口:觀察者利用主題的接口向主題注冊,而主題利用觀察者接口通知觀察者。這樣可以讓兩者之間運(yùn)作正常,又同時具有松耦合的優(yōu)點(diǎn)! ——針對接口編程,不針對實(shí)現(xiàn)編程!

 

 

  觀察者模式利用“組合”將許多觀察者組合進(jìn)主題中。對象(觀察者——主題)之間的這種關(guān)系不是通過繼承產(chǎn)生的,而是在運(yùn)行時利用組合的方式產(chǎn)生的。 ——多用組合,少用繼承!

 

 

 

/**

 * 觀察者模式

 * @author: Mac

 * @date: 2012/02/22

 */

  

class Paper{ /* 主題    */

    private $_observers = array();

 

    public function register($sub){ /*  注冊觀察者 */

        $this->_observers[] = $sub;

    }

 

     

    public function trigger(){  /*  外部統(tǒng)一訪問    */

        if(!empty($this->_observers)){

            foreach($this->_observers as $observer){

                $observer->update();

            }

        }

    }

}

 

/**

 * 觀察者要實(shí)現(xiàn)的接口

 */

interface Observerable{

    public function update();

}

 

class Subscriber implements Observerable{

    public function update(){

        echo "Callback\n";

    }

}

 

 

 

 

 

/*  測試    */

$paper = new Paper();

$paper->register(new Subscriber());

//$paper->register(new Subscriber1());

//$paper->register(new Subscriber2());

$paper->trigger();

 

 

當(dāng)新對象要填入的時候,只需要在主題(又叫可觀察者)中進(jìn)行注冊(注冊方式很多,你也可以在構(gòu)造的時候,或者框架訪問的接口中進(jìn)行注冊),然后實(shí)現(xiàn)代碼直接在新對象的接口中進(jìn)行。這降低了主題對象和觀察者對象的耦合度。

 

 

命令鏈模式:

 

  命令鏈模式以松散耦合主題為基礎(chǔ),發(fā)送消息、命令和請求,或通過一組處理程序發(fā)送任意內(nèi)容。每個處理程序都會自行判斷自己能否處理請求。如果可以,該請求被處理,進(jìn)程停止。您可以為系統(tǒng)添加或移除處理程序,而不影響其他處理程序。

 

 

 

 

 

1.interface Validator  

2.{  

3.    /**  

4.     * The method could have any parameters.  

5.     * @param mixed  

6.     * @return boolean  

7.     */ 

8.    public function isValid($value);  

9.}  

10. 

11./**  

12. * ConcreteCommand.  

13. */ 

14.class MoreThanZeroValidator implements Validator  

15.{  

16.    public function isValid($value)  

17.    {  

18.        return $value > 0;  

19.    }  

20.}  

21. 

22./**  

23. * ConcreteCommand.  

24. */ 

25.class EvenValidator implements Validator  

26.{  

27.    public function isValid($value)  

28.    {  

29.        return $value % 2 == 0;  

30.    }  

31.}  

32. 

33./**  

34. * The Invoker. An implementation could store more than one  

35. * Validator if needed.  

36. */ 

37.class ArrayProcessor  

38.{  

39.    protected $_rule;  

40. 

41.    public function __construct (Validator $rule)  

42.    {  

43.        $this->_rule = $rule;  

44.    }  

45. 

46.    public function process(array $numbers)  

47.    {  

48.        foreach ($numbers as $n) {  

49.            if ($this->_rule->IsValid($n)) {  

50.                echo $n, "\n";  

51.            }  

52.        }  

53.    }  

54.}  

55. 

56.// Client code  

57.$processor = new ArrayProcessor(new EvenValidator());  

58.$processor->process(array(1, 20, 18, 5, 0, 31, 42)); 

 

 

 

 

 

 

策略模式:

  策略模式是對象的行為模式,用意是對一組算法的封裝。動態(tài)的選擇需要的算法并使用。

 

  策略模式指的是程序中涉及決策控制的一種模式。策略模式功能非常強(qiáng)大,因?yàn)檫@個設(shè)計模式本身的核心思想就是面向?qū)ο缶幊痰亩嘈涡运枷搿?/p>

 

什么是多形性:

“對于面向?qū)ο蟮某绦蛟O(shè)計語言,多型性是第三種最基本的特征(前兩種是數(shù)據(jù)抽象和繼承?!?/p>

 

  “多形性”(Polymorphism)從另一個角度將接口從具體的實(shí)施細(xì)節(jié)中分離出來,亦即實(shí)現(xiàn)了“是什么”與“怎樣做”兩個模塊的分離。利用多形性的概念,代碼的組織以及可讀性均能獲得改善。此外,還能創(chuàng)建“易于擴(kuò)展”的程序。無論在項(xiàng)目的創(chuàng)建過程中,還是在需要加入新特性的時候,它們都可以方便地“成長”。

 

 

策略模式的三個角色:

1.抽象策略角色

2.具體策略角色

3.環(huán)境角色(對抽象策略角色的引用)

實(shí)現(xiàn)步驟:

1.定義抽象角色類(定義好各個實(shí)現(xiàn)的共同抽象方法)

2.定義具體策略類(具體實(shí)現(xiàn)父類的共同方法)

3.定義環(huán)境角色類(私有化申明抽象角色變量,重載構(gòu)造方法,執(zhí)行抽象方法)

策略模式的代碼實(shí)例:

 

< php

 

    abstract class baseAgent { //抽象策略類

        abstract function PrintPage();

    }

    //用于客戶端是IE時調(diào)用的類(環(huán)境角色)

    class ieAgent extends baseAgent {

        function PrintPage() {

            return 'IE';

        }

    }

    //用于客戶端不是IE時調(diào)用的類(環(huán)境角色)

    class otherAgent extends baseAgent {

        function PrintPage() {

            return 'not IE';

        }

    }

 

    class Browser { //具體策略角色

        public function call($object) {

            return $object->PrintPage ();

        }

    }

    $bro = new Browser ();

    echo $bro->call ( new ieAgent () );

     >

 

 

就在編程領(lǐng)域之外,有許多例子是關(guān)于策略模式的。例如:

 

如果我需要在早晨從家里出發(fā)去上班,我可以有幾個策略考慮:我可以乘坐地鐵,乘坐公交車,走路或其它的途徑。每個策略可以得到相同的結(jié)果,但是使用了不同的資源。

 

 

 

 

 

 

 

 


分享題目:PHP的設(shè)計模式
網(wǎng)頁路徑:http://weahome.cn/article/pposgj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部