中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

php設(shè)計(jì)模式有哪些-創(chuàng)新互聯(lián)

小編給大家分享一下php設(shè)計(jì)模式有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

為南華等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及南華網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、南華網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

1、單例模式

所謂單例模式,也就是在任何時(shí)候,應(yīng)用程序中只會(huì)有這個(gè)類的一個(gè)實(shí)例存在。常見(jiàn)的,我們用到單例模式只讓一個(gè)對(duì)象去訪問(wèn)數(shù)據(jù)庫(kù),從而防止打開(kāi)多個(gè)數(shù)據(jù)庫(kù)連接。要實(shí)現(xiàn)一個(gè)單例類應(yīng)包括以下幾點(diǎn):

和普通類不同,單例類不能被直接實(shí)例化,只能是由自身實(shí)例化。因此,要獲得這樣的限制效果,構(gòu)造函數(shù)必須標(biāo)記為private。
要讓單例類不被直接實(shí)例化而能起到作用,就必須為其提供這樣的一個(gè)實(shí)例。因此,就必須要讓單例類擁有一個(gè)能保存類的實(shí)例的私有靜態(tài)成員變量和對(duì)應(yīng)的一個(gè)能訪問(wèn)到實(shí)例的公共靜態(tài)方法。
在PHP中,為防止對(duì)單例類對(duì)象的克隆來(lái)打破單例類的上述實(shí)現(xiàn)形式,通常還為基提供一個(gè)空的私有__clone()方法。
下面是一個(gè)基本的單例模式:


復(fù)制代碼 代碼如下:

class SingetonBasic {
    private static $instance;

    // other vars..

    private function __construct() {
        // do construct..
    }

    private function __clone() {}

    public static function getInstance() {
        if (!(self::$instance instanceof self)) {
            self::$instance = new self();
        }
        return self::$instance;
    }

    // other functions..
}

$a = SingetonBasic::getInstance();
$b = SingetonBasic::getInstance();
var_dump($a === $b);


2、工廠模式
工廠模式在于可以根據(jù)輸入?yún)?shù)或者應(yīng)用程序配置的不同來(lái)創(chuàng)建一種專門(mén)用來(lái)實(shí)現(xiàn)化并返回其它類的實(shí)例的類。下面是一個(gè)最基本的工廠模式:

復(fù)制代碼 代碼如下:

class FactoryBasic {
    public static function create($config) {

    }
}


比如這里是一個(gè)描述形狀對(duì)象的工廠,它希望根據(jù)傳入的參數(shù)個(gè)數(shù)不同來(lái)創(chuàng)建不同的形狀。

復(fù)制代碼 代碼如下:

// 定義形狀的公共功能:獲取周長(zhǎng)和面積。
interface IShape {
    function getCircum();
    function getArea();
}

// 定義矩形類
class Rectangle implements IShape {
    private $width, $height;

    public function __construct($width, $height) {
        $this->width = $width;
        $this->height = $height;
    }

    public function getCircum() {
        return 2 * ($this->width + $this->height);
    }

    public function getArea() {
        return $this->width * $this->height;
    }
}

// 定義圓類
class Circle implements IShape {
    private $radii;

    public function __construct($radii) {
        $this->radii = $radii;
    }

    public function getCircum() {
        return 2 * M_PI * $this->radii;
    }

    public function getArea() {
        return M_PI * pow($this->radii, 2);
    }
}

// 根據(jù)傳入的參數(shù)個(gè)數(shù)不同來(lái)創(chuàng)建不同的形狀。
class FactoryShape {
    public static function create() {
        switch (func_num_args()) {
            case 1:
                return new Circle(func_get_arg(0));
                break;
            case 2:
                return new Rectangle(func_get_arg(0), func_get_arg(1));
                break;

        }
    }
}

// 矩形對(duì)象
$c = FactoryShape::create(4, 2);
var_dump($c->getArea());
// 圓對(duì)象
$o = FactoryShape::create(2);
var_dump($o->getArea());

使用工廠模式使得在調(diào)用方法時(shí)變得更容易,因?yàn)樗挥幸粋€(gè)類和一個(gè)方法,若沒(méi)有使用工廠模式,則要在調(diào)用時(shí)決定應(yīng)該調(diào)用哪個(gè)類和哪個(gè)方法;使用工廠模式還使得未來(lái)對(duì)應(yīng)用程序做改變時(shí)更加容易,比如要增加一種形狀的支持,只需要修改工廠類中的create()一個(gè)方法,而沒(méi)有使用工廠模式,則要修改調(diào)用形狀的代碼塊。

3、觀察者模式
觀察者模式為您提供了避免組件之間緊密耦合的另一種方法。該模式非常簡(jiǎn)單:一個(gè)對(duì)象通過(guò)添加一個(gè)方法(該方法允許另一個(gè)對(duì)象,即觀察者注冊(cè)自己)使本身變得可觀察。當(dāng)可觀察的對(duì)象更改時(shí),它會(huì)將消息發(fā)送到已注冊(cè)的觀察者。這些觀察者使用該信息執(zhí)行的操作與可觀察的對(duì)象無(wú)關(guān)。結(jié)果是對(duì)象可以相互對(duì)話,而不必了解原因。

一個(gè)簡(jiǎn)單的示例:當(dāng)聽(tīng)眾在收聽(tīng)電臺(tái)時(shí)(即電臺(tái)加入一個(gè)新聽(tīng)眾),它將發(fā)送出一條提示消息,通過(guò)發(fā)送消息的日志觀察者可以觀察這些消息。


復(fù)制代碼 代碼如下:

// 觀察者接口
interface IObserver {
    function onListen($sender, $args);
    function getName();
}

// 可被觀察接口
interface IObservable {
    function addObserver($observer);
    function removeObserver($observer_name);
}

// 觀察者類
abstract class Observer implements IObserver {
    protected $name;

    public function getName() {
        return $this->name;
    }
}

// 可被觀察類
class Observable implements IObservable {
    protected $observers = array();

    public function addObserver($observer) {
        if (!($observer instanceof IObserver)) {
            return;
        }
        $this->observers[] = $observer;
    }

    public function removeObserver($observer_name) {
        foreach ($this->observers as $index => $observer) {
            if ($observer->getName() === $observer_name) {
                array_splice($this->observers, $index, 1);
                return;
            }
        }
    }
}

// 模擬一個(gè)可以被觀察的類:RadioStation
class RadioStation extends Observable {

    public function addListener($listener) {
        foreach ($this->observers as $observer) {
            $observer->onListen($this, $listener);
        }
    }
}

// 模擬一個(gè)觀察者類
class RadioStationLogger extends Observer {
    protected $name = 'logger';

    public function onListen($sender, $args) {
        echo $args, ' join the radiostation.<br/>';
    }
}

// 模擬另外一個(gè)觀察者類
class OtherObserver extends Observer {
    protected $name = 'other';
    public function onListen($sender, $args) {
        echo 'other observer..<br/>';
    }
}

$rs = new RadioStation();

// 注入觀察者
$rs->addObserver(new RadioStationLogger());
$rs->addObserver(new OtherObserver());

// 移除觀察者
$rs->removeObserver('other');

// 可以看到觀察到的信息
$rs->addListener('cctv');


以上是“php設(shè)計(jì)模式有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站標(biāo)題:php設(shè)計(jì)模式有哪些-創(chuàng)新互聯(lián)
地址分享:http://www.rwnh.cn/article46/coiheg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃、企業(yè)建站虛擬主機(jī)、自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
轮台县| 堆龙德庆县| 都兰县| 泉州市| 彭州市| 福安市| 琼海市| 阳原县| 福海县| 南江县| 商水县| 治多县| 岑巩县| 临邑县| 林口县| 婺源县| 银川市| 临邑县| 临安市| 阜宁县| 汶川县| 桂林市| 来宾市| 阿克苏市| 板桥市| 通榆县| 胶州市| 高要市| 阿克| 东台市| 即墨市| 沈阳市| 三明市| 乐昌市| 乐山市| 鹿邑县| 鄄城县| 汶川县| 曲阳县| 建水县| 秦皇岛市|