天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

php設(shè)計模式小結(jié)

1、單例模式

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

和普通類不同,單例類不能被直接實(shí)例化,只能是由自身實(shí)例化。因此,要獲得這樣的限制效果,構(gòu)造函數(shù)必須標(biāo)記為private。
要讓單例類不被直接實(shí)例化而能起到作用,就必須為其提供這樣的一個實(shí)例。因此,就必須要讓單例類擁有一個能保存類的實(shí)例的私有靜態(tài)成員變量和對應(yīng)的一個能訪問到實(shí)例的公共靜態(tài)方法。
php中,為防止對單例類對象的克隆來打破單例類的上述實(shí)現(xiàn)形式,通常還為基提供一個空的私有__clone()方法。
下面是一個基本的單例模式:
復(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)用程序配置的不同來創(chuàng)建一種專門用來實(shí)現(xiàn)化并返回其它類的實(shí)例的類。下面是一個最基本的工廠模式:

復(fù)制代碼 代碼如下:
class FactoryBasic {
    public static function create($config) {

    }
}

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

復(fù)制代碼 代碼如下:
// 定義形狀的公共功能:獲取周長和面積。
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ù)個數(shù)不同來創(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;

        }
    }
}

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

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

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

一個簡單的示例:當(dāng)聽眾在收聽電臺時(即電臺加入一個新聽眾),它將發(fā)送出一條提示消息,通過發(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;
            }
        }
    }
}

// 模擬一個可以被觀察的類:Radiostation
class Radiostation extends Observable {

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

// 模擬一個觀察者類
class RadiostationLogger extends Observer {
    protected $name = 'logger';

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

// 模擬另外一個觀察者類
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ù)php設(shè)計模式小結(jié),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 伊人无码高清 | 日韩AV片无码一区二区三区不卡 | 国产永久免费高清在线观看 | 天美传媒在线完整免费观看网站 | 怡春院国产精品视频 | 在线 自拍 综合 亚洲 欧美 | 欧美高清vivoesosexo18 | 嫩草成人影院 | 飘雪在线观看免费高清完整版韩国 | 亚洲欧洲日产国码久在线 | 快播电影频道 | 免费精品国偷自产在线 | 亚洲高清在线视频 | 德国美女密密麻麻浓毛 | 入禽太深免费视频10 | 国产精品久久久久一区二区三区 | 亚洲精品国产一区二区贰佰信息网 | 色小姐.com | 日本十八禁无遮无挡漫画 | 69精品人妻一区二区三区蜜桃 | 精品一卡2卡三卡4卡乱码精品视频 | 国产高清免费视频免费观看 | 偷尝禁果H1V1幸运的山熊 | 男人插曲女人的叫声 | 國産麻豆AVMDMD0179 | 国产精品第八页 | 91久久精品国产亚洲 | 国产欧美另类久久久精品免费 | 免费播放美女一级毛片 | 亚洲精品无码AAAAAA片 | 第一次破女初国产美女 | 日韩精品亚洲专区在线影院 | 亚洲人成77777 | 99久久久A片无码国产精 | 肉动漫无修在线播放 | 伦理片92伦理午夜 | 星空无限传媒视频在线观看视频 | 精品久久久久中文字幕加勒比东京热 | 国产亚洲视频在线观看 | 99精彩免费观看 | 国语自产视频在线不卡 |