2020 PHP設(shè)計(jì)模式

1瞧掺、單例模式

一個(gè)類,只能允許有一個(gè)對象存在

<?php
class test{
    protected function __construct(){
    }

    public static function getInstance(){
        $_test = new test();
        return $_test;
    }
}
$test = test::getInstance();
var_dump($test);
?>

2凡傅、工廠模式

工廠模式辟狈,顧名思義,如同工廠一樣夏跷,你把原材料放入工廠中哼转,出來的是成品,而你并不需要知道工廠里做了什么槽华,工廠模式主要用于解耦壹蔓。

把對象的創(chuàng)建和使用的過程分開,比如: ClassA 調(diào)用 ClassB猫态,那么 ClassA 只調(diào)用ClassB 的方法庶溶,至于實(shí)例化 ClassB 則在工廠內(nèi)實(shí)現(xiàn)。這樣既減少了代碼的重復(fù)使用懂鸵,也方便對 ClassB 的后期維護(hù)。如果 ClassB 實(shí)例化過程很復(fù)雜行疏,使用簡單工廠模式就會發(fā)現(xiàn)外部無需關(guān)注復(fù)雜的實(shí)例化匆光,只管調(diào)用 ClassB 的方法即可,減少錯(cuò)誤
interface  mysql{ 
    public function connect();
}
 
class mysqli2  implements mysql{
    public  function connect(){
        echo 'mysqli';
    }
}
 
class pdo2 implements mysql{
    public function connect(){
        echo 'pdo';
    }
}

class mysqlFactory{
    static public function factory($class_name){
        return new $class_name();
    }
}
$obj = mysqlFactory::factory('pdo2');
$obj->connect();

3酿联、注冊模式

注冊模式终息,解決全局共享和交換對象夺巩。已經(jīng)創(chuàng)建好的對象,掛在到某個(gè)全局可以使用的數(shù)組上周崭,在需要使用的時(shí)候柳譬,直接從該數(shù)組上獲取即可。將對象注冊到全局的樹上续镇。任何地方直接去訪問美澳。

<?php
class Register
{
       protected static  $objects;
        function set($alias,$object)//將對象注冊到全局的樹上
        {
            self::$objects[$alias]=$object;//將對象放到樹上
        }
        static function get($name){
            return self::$objects[$name];//獲取某個(gè)注冊到樹上的對象
         }
    function _unset($alias)
  {
          unset(self::$objects[$alias]);//移除某個(gè)注冊到樹上的對象。
        }
}
\Auto\Register::set('single',$single);
$single = \Auto\Register::get('single');
var_dump($single);

4摸航、適配器模式

將一個(gè)類的接口轉(zhuǎn)換成客戶希望的另外一個(gè)接口制跟。

//目標(biāo)角色
interface Aims
{
    public function newMethod1();
    public function newMethod2();
}
 
//需要被適配的類(Adaptee)
Class Man
{
    public function oldMethod1()
    {
        echo 'man';
    }
 
    public function oldMethod2()
    {
        echo '男人';
    }
}
 
//需要被適配的類(Adaptee)
Class Woman
{
    public function oldMethod1()
    {
        echo 'woman';
    }
 
    public function oldMethod2()
    {
        echo '女人';
    }
}
 
//適配器,
Class Adapters implements Aims
{
    private $adaptee;
    public function __construct($adaptee)
    {
        $this->adaptee = $adaptee;
    }
 
    public function newMethod1()
    {
        //以少量的代碼對被適配者作出適配
        echo 'sex :';
        $this->adaptee->oldMethod1();
    }
 
    public function newMethod2()
    {
        echo 'sex name :';
        $this->adaptee->oldMethod2();
    }
}
 
$adapter1 = new Adapters(new Man);
$adapter1->newMethod1();
$adapter2 = new Adapters(new Woman);
$adapter2->newMethod2();

5酱虎、策略模式

這是一個(gè)男人和女人的問題雨膨,將一組特定的行為和算法封裝成類,以適應(yīng)某些特定的上下文環(huán)境读串。

UserStrategy.php
<?php
/*
 * 聲明策略文件的接口聊记,約定策略包含的行為。
 */
interface UserStrategy
{
    function showAd();
    function showCategory();
}
FemaleUser.php
<?php
class FemaleUser implements UserStrategy
{
    function showAd(){
        echo "2016冬季女裝";
    }
    function showCategory(){
        echo "女裝";
    }
}
MaleUser.php
<?php
class MaleUser implements UserStrategy
{
    function showAd(){
        echo "IPhone6s";
    }
    function showCategory(){
        echo "電子產(chǎn)品";
    }
}
Page.php//執(zhí)行文件
<?php
require_once 'Loader.php';
class Page
{
    protected $strategy;
    function index(){
        echo "AD";
        $this->strategy->showAd();
        echo "<br>";
        echo "Category";
        $this->strategy->showCategory();
        echo "<br>";
    }
    function setStrategy(UserStrategy $strategy){
        $this->strategy=$strategy;
    }
}

$page = new Page();
if(isset($_GET['male'])){
    $strategy = new MaleUser();
}else {
    $strategy = new FemaleUser();
}
$page->setStrategy($strategy);
$page->index();

6恢暖、原型模式

不常用排监,大的對象類才使用,表現(xiàn)在clone

7胀茵、觀察者模式

從面向過程的角度來看社露,首先是觀察者向主題注冊,注冊完之后琼娘,主題再通知觀察者做出相應(yīng)的操作峭弟,整個(gè)事情就完了

/**
 * 事件產(chǎn)生類
 * Class EventGenerator
 */
abstract class EventGenerator
{
    private $ObServers = [];

    //增加觀察者
    public function add(ObServer $ObServer)
    {
        $this->ObServers[] = $ObServer;
    }

    //事件通知
    public function notify()
    {
        foreach ($this->ObServers as $ObServer) {
            $ObServer->update();
        }
    }

}

/**
 * 觀察者接口類
 * Interface ObServer
 */
interface ObServer
{
    public function update($event_info = null);
}

/**
 * 觀察者1
 */
class ObServer1 implements ObServer
{
    public function update($event_info = null)
    {
        echo "觀察者1 收到執(zhí)行通知 執(zhí)行完畢!\n";
    }
}

/**
 * 觀察者1
 */
class ObServer2 implements ObServer
{
    public function update($event_info = null)
    {
        echo "觀察者2 收到執(zhí)行通知 執(zhí)行完畢脱拼!\n";
    }
}

/**
 * 事件
 * Class Event
 */
class Event extends EventGenerator
{
    /**
     * 觸發(fā)事件
     */
    public function trigger()
    {
        //通知觀察者
        $this->notify();
    }
}

//創(chuàng)建一個(gè)事件
$event = new Event();
//為事件增加旁觀者
$event->add(new ObServer1());
$event->add(new ObServer2());
//執(zhí)行事件 通知旁觀者
$event->trigger();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞒瘸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子熄浓,更是在濱河造成了極大的恐慌情臭,老刑警劉巖赌蔑,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異娃惯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)趾浅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門愕提,熙熙樓的掌柜王于貴愁眉苦臉地迎上來馒稍,“玉大人,你說我怎么就攤上這事浅侨。” “怎么了如输?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挨决。 經(jīng)常有香客問我请祖,道長,這世上最難降的妖魔是什么脖祈? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任肆捕,我火速辦了婚禮盖高,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘喻奥。我一直安慰自己,他們只是感情好撞蚕,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著甥厦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刀疙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天竟纳,我揣著相機(jī)與錄音,去河邊找鬼锥累。 笑死,一個(gè)胖子當(dāng)著我的面吹牛揩悄,可吹牛的內(nèi)容都是我干的鬼悠。 我是一名探鬼主播删性,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼焕窝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了它掂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤榕茧,失蹤者是張志新(化名)和其女友劉穎客给,沒想到半個(gè)月后用押,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靶剑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了缎讼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡血崭,死狀恐怖厘灼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情手幢,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布围来,位于F島的核電站,受9級特大地震影響监透,放射性物質(zhì)發(fā)生泄漏桶错。R本人自食惡果不足惜胀蛮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望粪狼。 院中可真熱鬧任岸,春花似錦、人聲如沸享潜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽澜术。三九已至,卻和暖如春鸟废,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背侮攀。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留兰英,地道東北人撇叁。 一個(gè)月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓畦贸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親薄坏。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359