php 設計模式

2021-07-13 09:52:51 字數 4547 閱讀 8596

第一版的設計**如下:

weatherdata.php

<?php 

/** * 氣象站類,用於提供氣象資料,資料變化時及時推送至使用者的裝置

* * @author ben

* */

class weatherdata

/*** 當資料變更時向使用者推送即時資料

*/public function datachanged()

}

**的壞味道:

氣象站類weatherdata與使用者的裝置類mac、iphone、iwatch類之間存在著強耦合關係,而真實的場景中使用者可能隨時會取消業務,或者為新的電子產品訂閱該業務,這就意味著我們今後將會頻繁的修改這個檔案中的**。

下面我們來看看觀察者模式是怎麼為我們解決這個難題的。

要理解觀察者模式,可以結合真實的案例,比如說訂閱報紙,仔細想想在這樣的場景中存在哪幾種元素:

1、報紙的發布者;

2、報紙的訂閱者;

發布者與訂閱者組成了觀察者的兩個基本要素。具體用uml類圖描述如下:

具體的實現**:

subject.php

<?php 

abstract class subject

public function removeobserver($key) }

abstract function notify();

// foreach ($this->observer as $observer)

}

equipment.php

<?php 

abstract class equipment

weatherdata.php

<?php 

require_once 'subject.php';

class weatherdata extends subject }

public function datachange($temperature, $pressure, $humidity)

}

mac.php

<?php 

require_once 'equipment.php';

class mac extends equipment

/* (non-phpdoc)

* @see equipment::display()

*/public function display()

}

iwatch.php

<?php 

require_once 'equipment.php';

class iwatch extends equipment

/* (non-phpdoc)

* @see equipment::display()

*/public function display()

}

iphone.php

<?php 

require_once 'equipment.php';

class iphone extends equipment

/* (non-phpdoc)

* @see equipment::display()

*/public function display()

}

index.php

<?php 

require_once 'weatherdata.php';

require_once 'iwatch.php';

require_once 'iphone.php';

require_once 'mac.php';

$subject = new weatherdata();

$observer1 = new iwatch();

$observer2 = new iphone();

$observer3 = new mac();

$subject->addobserver('iwatch', $observer1);

$subject->addobserver('iphone', $observer2);

$subject->addobserver('mac', $observer3);

$subject->datachange('38攝氏度', '氣壓好高啊', '很濕潤');

執行結果是:

current conditions:

temperature:38攝氏度;

pressure:氣壓好高啊;

humidity:很濕潤;

--from iwatch client

current conditions:

temperature:38攝氏度;

pressure:氣壓好高啊;

humidity:很濕潤;

--from iphone client

current conditions:

temperature:38攝氏度;

pressure:氣壓好高啊;

humidity:很濕潤;

--from mac client

當然php已經幫我們準備好了兩個介面,我們沒有必要重造輪子,這兩個介面分別是splobserver和splsubject,關於這兩個介面的定義,可以檢視以下官方文件:

splobserver:

splsubject:

使用這兩個介面之後我們進一步修改後的**清單如下:

index.php

<?php 

require_once 'weatherdata.php';

require_once 'iwatch.php';

require_once 'iphone.php';

require_once 'mac.php';

$subject = new weatherdata();

$observer1 = new iwatch();

$observer2 = new iphone();

$observer3 = new mac();

$subject->attach($observer1);

$subject->attach($observer2);

$subject->attach($observer3);

$subject->datachange('38攝氏度', '氣壓好高啊', '很濕潤');

iphone.php

<?php 

class iphone implements splobserver

/* (non-phpdoc)

* @see equipment::display()

*/public function display()

}

iwatch.php

<?php 

class iwatch implements splobserver

/* (non-phpdoc)

* @see equipment::display()

*/public function display()

}

mac.php

<?php 

class mac implements splobserver

/* (non-phpdoc)

* @see equipment::display()

*/public function display()

}

weatherdata.php

<?php 

class weatherdata implements splsubject }

public function datachange($temperature, $pressure, $humidity)

public function gettemperature()

public function getpressure()

public function gethumidity()

/* (non-phpdoc)

* @see splsubject::attach()

*/public function attach(splobserver $observer)

/* (non-phpdoc)

* @see splsubject::detach()

*/public function detach(splobserver $observer) }

}

php設計 PHP常用設計模式

1 單例模式指在整個應用中只有乙個物件例項的設計模式 class single public rand static private instance 類直接呼叫 final private function construct private防止外部new this rand mt rand 1,...

PHP設計模式 工廠設計模式

工廠模式,如其名稱一樣,就是乙個工廠,用於建立產品。使用工廠模式的好處就是請求者只需要發出請求,具體的例項化過程交給工廠模式,省去了new的過程。並且如果後期開發,類名發生變化,只需要調整工廠模式中一行new相關 不需要修改一大堆 最簡單的工廠模式,實際上就是乙個switch case結構,通過傳入...

php設計模式

php設計模式介紹 導言 php設計模式介紹 第一章 程式設計慣用法 php設計模式介紹 第二章 值物件模式 php設計模式介紹 第三章 工廠模式 php設計模式介紹 第四章 單條模式 php設計模式介紹 第五章 註冊模式 php設計模式介紹 第六章 偽物件模式 php設計模式介紹 第七章 策略模式...