摘要:責任鏈模式權利越大的人管理越多,越嚴重的問題,越得往上級找,底層的人只能管理雞毛蒜皮的小事。使用適配器模式,轉成想通模式。
什么是設計模式
在軟件開發過程中,經常出現的經典場景的典型解決方案,稱為設計模式
如何學習設計模式
典型場景 --> 典型問題 --> 典型解決辦法
多態用來消除邏輯語句.
多態(ploymorphism)是一個生物學上的概念,指同一特種的多種表現形態.
在面向對象中,指某種對象實例的不同表現形態.
"; } } class MTiger extends Tiger { public function climb() { echo "Up" , "
"; } } class Cat { public function climb() { echo "Fly"; } } class Client { public static function call(Tiger $animal) { // 參數限定不嚴格,可以更加靈活, 可以傳遞一個父類類型,就可以有不同的子類形態 $animal->climb(); } } Client::call(new XTiger()); Client::call(new MTiger()); Client::call(new Cat()); ?>
在23種設計模式中,可以有些模式可以自然消除的.
面向接口開發減少new 的操作.
熟悉概念:
調用端的概念
客戶端(Client)的概念
例如:在Java中,寫了一堆類,最終打成一個包。調用端可以把包引入,然后使用類中定義的方法,在開發過程中可以使用查看里面的方法。
假設:開發中引入的是sdk,都不讓看。如何調用,必須開放一些接口。存在面向接口開發
接口:共同的規則
面向接口開發
"; } } class DbSqlite implements DB { public function conn() { echo "conn sqlite簡單工廠模式
"; } } // ***客戶端**** (看不到DbMysql,DbSqlite的內部實現細節) // 只知道,上述兩個類實現了db接口 $db = new DbMysql(); $db->conn(); $db = new DbSqlite(); $db->conn(); // 無論是開發者,還是調用者都是為接口負責
模式的作用:
發生連接的雙方,知道的越少越好.
在面向對象設計法則中,重要的開閉原則:對于修改是封閉的,對于擴展是開放的.
"; } } class DbSqlite implements DB { public function conn() { echo "conn sqlite工廠方法
"; } } // 簡單工廠 class Factory { public static function createDB($type) { if ($type == "mysql") { return new DbMysql(); } else if ($type == "sqlite") { return new DbSqlite(); } else { throw new Exception("Error db type", 1); } } } // 客戶端不知道服務端到底有哪些類名, // 只知道對方開放了一個Factory::createDB方法. // 靜態方法允許傳遞數據庫名稱 $msqyl = Factory::createDB("mysql"); $msqyl->conn(); $sqlit = Factory::createDB("sqlite"); $sqlit->conn(); // 如果增加oracle類型,怎么辦? // 服務端要修改Factory的內容(在Java,C++中,改完之后還得再編譯) // 在面向對象設計法則中,重要的開閉原則 --- 對于修改是封閉的,對于擴展是開放的. // 需求可以擴展子類來實現。
進行擴展,避免對原有數據進行修改,只需要新增代碼的子類,就可以完成。
對于修改是封閉的,對于擴展是開放的.
"; } } class DbSqlite implements DB { public function conn() { echo "conn sqlite單例模式
"; } } class MySqlFactory implements Factory { public function createDB() { return new DbMysql(); } } class SqliteFactory implements Factory { public function createDB() { return new DbSqlite(); } } // ==== 服務器端添加oracle類 // 進行擴展,避免對原有數據進行修改 class orcale implements DB { public function conn() { echo "conn orcal
"; } } class orcaleFactory implements Factory { public function createDB() { return new orcale(); } } // ------客戶端開始調用. $fact = new MysqlFactory(); $db = $fact->createDB(); $db->conn(); $fact = new SqliteFactory(); $db = $fact->createDB(); $db->conn();
常見使用場景:
需要數據庫類的時候
操作cookie類
上傳圖片類
DB.class.php Upload.class.php Cookie.class.php // 這三個類都需要讀取配置文件信息,而配置文件是共用的,因此配置讀取類有一個對象就夠了。 // (如何保證對象只有一個)
PHP對象什么時候全等
二個對象是一個的時候.
單例模式實現
封閉外部new操作
內部開公共接口,負責new操作,控制單一實例
禁止繼承覆蓋__construcotr
防止克隆
觀察者模式一個對象變化,引起其它對象的反應。可以讓其它幾個對象觀察變化的對象的反應.
一對多的關系.
優點:解耦。
觀察者模式中的三者: Subject, Observer, Client;
// Subject attach() // 記憶多個的對象 detach() // 告知記憶的對象,變化情況 notify() // 更新通知 // Observer update() // 更新對象中執行的邏輯 // Client // 調用添加觀察者`attach()`JavaScript實現觀察者模式:
var select = document.querySelector("select"); var content = document.querySelector(".content"); var ad = document.querySelector(".ad"); // Subject select.observer = {}; // 添加觀察者 select.attach = function(key, obj) { this.observer[key] = obj; } // 刪除觀察者 select.detach = function(key) { delete this.observer[key]; } // 更新通知 select.onchange = select.ontify = function() { for (var key in this.observer) { this.observer[key].update(this); } } // Observer // 觀察者 content.update = function(observer) { // 參數是被觀察者對象 alert("content"); if (observer.value) { // 邏輯代碼 } } ad.update = function(observer) { // 參數是被觀察者對象 alert("ad"); if (observer.value) { // 邏輯代碼 } } // Client // 監聽 select.attach("content", content); // 只需要把獨特的表示加入 對象key中 select.attach("ad", ad);PHP實現觀察者模式:
單一功能原則:類或者一個方法,完成一個功能即可.
PHP中內置接口:
Splsubject
Splobserver
內置類:
Splobjectstoragelognum = rand(1, 10); $this->hobby = $hobby; $this->observers = new SplObjectStorage(); } public function login() { // 類或者一個方法,完成一個功能即可. (單一功能原則) // 操作session $this->notify(); } public function attach(SplObserver $observer) { $this->observers->attach($observer); } public function detach(SplObserver $observer) { $this->observers->detach($observer); } public function notify() { $this->observers->rewind(); while($this->observers->valid()) { $observer = $this->observers->current(); $observer->update($this); $this->observers->next(); } } } /** 觀察者 */ class Secrity implements SplObserver { public function update(SplSubject $subject) { // 傳入的 對象是$subject,$subject是干什么,隨你的意. if($subject->lognum < 3) { echo "這個第" . $subject->lognum . "次安全登錄職責鏈模式
"; } else { echo "這個第" . $subject->lognum . "次登錄,異常
"; } } } class Ad implements SplObserver { public function update(SplSubject $subject) { if ($subject->hobby == "sport") { echo "sport,nba
"; } else { echo "good good study, day day up
"; } } } /** Client */ $user = new User("study"); $user->attach(new Secrity()); $user->attach(new Ad()); $user->login();也稱之為責任鏈模式(chain of resionbility)
對象產生的過程中,放在邏輯判斷中.
面向過程和面向對象混雜在一塊,沒有充分拆開。責任鏈模式:
權利越大的人管理越多,越嚴重的問題,越得往上級找,底層的人只能管理雞毛蒜皮的小事。
每個人都有處理事情的,權利范圍.
責任鏈模式最終都需要都一級能夠處理.
先處理最近的一級
每個對象中有職責功能,上級.
每個對象,儲存著對自己上級的引用,如果自己處理不了,交給上一級。優點:使用到那一級才會new 出那一級。
power) { echo "刪除"; } else { $top = new $this->top; $top->process($lev); } } } class admin { public $power = 2; protected $top = "police"; public function process($lev) { if ($lev <= $this->power) { echo "封閉"; } else { $top = new $this->top; $top->process($lev); } } } class police { protected $power; protected $top = null; public function process() { echo "抓!~"; } } $lev = 1; $judge = new borad(); // 距離最近的一級 $judge->process($lev);策略模式和工廠模式相似的一種模式
calc = new $calc(); } public function calc($op1, $op2) { return $this->calc->calc($op1, $op2); } } $cmath = new CMath($op); var_dump($cmath->calc(10, 100));工廠方法和策略模式的區別:
裝飾器模式
工廠方法是傳遞不同參數,直接把零件(子類)進行操作。
策略模式是,真實的子類,虛擬成一個父類, 父類中操作(零件)子類。不需要直接碰子類,聚合成一個父類。問題:繼承層次越來越多、
content = $content; } public function decorator() { return $this->content; } } $art = new Article("goods goods study, day day up
"); echo $art->decorator(); // ----------------------------------------------------- // 文章需要, 需要編輯人員專門編輯 class BianArt extends article { // 重新加工對decorator public function summary() { return $this->content . "編輯摘要
"; } } $art = new BianArt("goods goods study, day day"); echo $art->summary(); // ----------------------------------------------------- // 文章需要, 需要做SEO class SeoArt extends BianArt { public function seo() { $content = $this->summary(); return $content . "seo
"; } } $art = new SeoArt("lz"); echo $art->seo(); // ----------------------------------------------------- // 文章需要,廣告部多帶帶管理 class Ad extends SeoArt { // 層次越來越深,目的是:給文章添加各種內容 } // 繼承層次越來越多,裝飾器模式可以解決,變成倆級繼承使用裝飾器模式,修改多級繼承
父類負責主要邏輯,子類負責裝飾,修飾。(重寫父類的方法,裝飾之后再次返回)
content = $content; } public function decorator() { return $this->content; } } // 編輯文章 class BianArt extends BaseArt { public function __construct(BaseArt $art) { $this->art = $art; $this->decorator(); } public function decorator() { return $this->content = $this->art->decorator() . "編輯人員,文章摘要"; } } // SEO人員 class SeoArt extends BaseArt { public function __construct(BaseArt $art) { $this->art = $art; $this->decorator(); } public function decorator() { return $this->content = $this->art->decorator() . "SEO"; } } $art = new BaseArt("day day up"); // echo $art->decorator(); $art1 = new BianArt($art); // echo $art1->decorator(); $art2 = new SeoArt($art1); echo $art2->decorator();適配器模式把不適用的格式或者數據類型,轉換成適用目前場景
28, "wind" => 7, "sun" => 1); return serialize($today); } } // 增加一個代理,適配器 class AdapterTainqi extends tianqi { public static function show() { $today = parent::show(); $today = unserialize($today); $today = json_encode($today); return $today; } } // =====客戶端調用===== $taiqni = unserialize(tianqi::show()); echo "溫度:",$taiqni["tep"], "風力:", $taiqni["wind"] , "橋接模式
"; // java客戶端,并不認識PHP的串行化后的字符串。使用適配器模式,轉成想通模式。 $tq = AdapterTainqi::show(); $td = json_decode($tq); echo "溫度:",$td->tep, "風力:", $td->wind;在某種場景下,多個條件有共同作用,增加耦合關系,減少邏輯復雜程度
這個世界上的因素都不是單一的,都是相互耦合的.send = $send; } abstract public function msg($content); public function send($to, $content) { $content = $this->msg($content); $this->send->send($to, $content); } } class zn { public function send($to, $content) { echo "zn: ", $to, "內容是:", $content; } } class email { public function send($to, $content) { echo "email: ", $to, "內容是:", $content; } } class sms { public function send($to, $content) { echo "sms: ", $to, "內容是:", $content; } } class commonInfo extends info { public function msg($content) { return "common". $content; } } class warnInfo extends info { public function msg($content) { return "warn". $content; } } class dangerInfo extends info { public function msg($content) { return "danger". $content; } } // 站內發普通信息 $commonInfo = new commonInfo(new zn()); $commonInfo->send("小明", "吃晚飯"); // sms發普通信息 $commonInfo = new commonInfo(new sms()); $commonInfo->send("小紅", "吃晚飯");
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/23034.html
摘要:一什么是單例設計模式單例模式,也叫單子模式,是一種常用的軟件設計模式。在應用這個模式時,單例對象的類必須保證只有一個實例存在。 一、什么是單例設計模式 單例模式,也叫單子模式,是一種常用的軟件設計模式。在應用這個模式時,單例對象的類必須保證只有一個實例存在。 二、單例模式的技巧 利用$_instance私有變量來保存類的唯一實例化對象; 設計一個getInstance對外公開的函數,...
摘要:的設計模式有很多種,本文取最簡單的三種模式工廠模式單例模式和注冊樹模式進行簡單的講解。文件創建完后,咱們回到單元測試文件文件再執行一下單元測試命令發現,也能返回成功,這樣的話我們就能很方便的修改任何驅動了。 php 設計模式之工廠模式、單例模式、注冊樹模式 在軟件工程中,創建型設計模式承擔著對象創建的職責,嘗試創建適合程序上下文的對象,對象創建設計模式的產生是由于軟件工程設計的問題,具...
摘要:單例模式顧名思義,就是只有一個實例。為什么要使用單例模式語言本身的局限性語言是一種解釋型的腳本語言,這種運行機制使得每個頁面被解釋執行后,所有的相關資源都會被回收。 單例模式(Singleton Pattern):顧名思義,就是只有一個實例。作為對象的創建模式,單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統提供這個實例。 為什么要使用單例模式 1、PHP語言本身的局限性P...
摘要:類也是一個只包含構造器的低級類,與和類相似。安裝擴展對于平臺,需要在中加入如下代碼上面的工作完成之后,還需要注意的是擴展在配置文件中有獨立的代碼片段這些配置項主要是用來指定處理文件時使用緩存的行為。支持與擴展類似的。 原文地址:PHP SOAP 擴展,本文在原文基礎上添加了一些內容和章節,也加入了一些注釋,請讀者注意。 前兩篇文章 《SOAP 介紹》 和 《SOAP Web 服務介紹》...
閱讀 3537·2021-10-09 09:41
閱讀 2742·2021-10-08 10:18
閱讀 2178·2021-09-10 10:51
閱讀 2677·2021-09-10 10:50
閱讀 773·2021-09-09 09:33
閱讀 3380·2021-09-06 15:14
閱讀 3014·2019-08-30 11:06
閱讀 3244·2019-08-29 14:04