精通php設(shè)計模式各個擊破案例測試源碼_第1頁
精通php設(shè)計模式各個擊破案例測試源碼_第2頁
精通php設(shè)計模式各個擊破案例測試源碼_第3頁
精通php設(shè)計模式各個擊破案例測試源碼_第4頁
精通php設(shè)計模式各個擊破案例測試源碼_第5頁
已閱讀5頁,還剩119頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、精通php設(shè)計模式各個擊破案例測試源碼設(shè)計模式 對應(yīng)特點【原】 PHP 設(shè)計模式二十三之解釋器設(shè)計模式 迷你新語言【原】 PHP 設(shè)計模式二十二之迭代子設(shè)計模式 循環(huán)【原】 PHP 設(shè)計模式二十一之訪問者設(shè)計模式 數(shù)據(jù)處理與數(shù)據(jù)結(jié)構(gòu)分離【原】 PHP 設(shè)計模式二十之模板設(shè)計模式 規(guī)范執(zhí)行骨架【原】 PHP 設(shè)計模式十九之享元設(shè)計模式 共享細微粒,減少開銷【原】 PHP 設(shè)計模式十八之備忘錄設(shè)計模式 存檔【原】 PHP 設(shè)計模式十七之外觀設(shè)計模式 統(tǒng)一接口,方便組合【原】 PHP 設(shè)計模式十六之狀態(tài)設(shè)計模式 有序開關(guān)狀態(tài),【原】 PHP 設(shè)計模式十五之中介者設(shè)計模式 中介【原】 PHP 設(shè)計模式

2、十四之職責(zé)鏈設(shè)計模式 傳遞命令【原】 PHP 設(shè)計模式十三之命令設(shè)計模式 命令集中處理,命令看成對象【原】 PHP 設(shè)計模式十二之組合設(shè)計模式 整體與部分一致【原】 PHP 設(shè)計模式十一之橋接設(shè)計模式 抽象與現(xiàn)實分離【原】 PHP 設(shè)計模式十之建造者設(shè)計模式 構(gòu)建和表示分離【原】 PHP 設(shè)計模式九之單例設(shè)計模式唯一實例【原】 PHP 設(shè)計模式八之觀察者設(shè)計模式 數(shù)組 1對多通知【原】 PHP 設(shè)計模式七之原型設(shè)計模式克隆【原】 PHP 設(shè)計模式六之代理設(shè)計模式代理處理 【原】 PHP 設(shè)計模式五之工廠方法設(shè)計模式 批量實例,抽象【原】 PHP 設(shè)計模式四之適配器設(shè)計模式 不同接口【原】 PH

3、P 設(shè)計模式三之策略設(shè)計模式算法【原】 PHP 設(shè)計模式二之修飾器模式包裹原數(shù)據(jù)【原】 PHP 設(shè)計模式一之簡單工廠模式 批量實例PHP 設(shè)計模式一之(簡單)工廠模式邊學(xué)習(xí)理論邊實踐才是真!工廠模式: 簡單工廠模式 工廠方法模式 抽象工廠模式后面我會一一寫出,并分析他們區(qū)別,優(yōu)缺下面是學(xué)習(xí)后模擬寫的代碼<?php/* * 計算器 OOP開發(fā) 練習(xí) 簡單的工廠模式 * 目前運算符號暫定為:加減乘除,以后會擴展平方等 * 定義:經(jīng)過一定的邏輯,需要實例對應(yīng)的對象對象可以完全不同,經(jīng)常配合策略模式使用這里的對象有相似性 * author Chen Wei Han <csq-3> *

4、 copyright Copyright &copy; 2011 Chen Wei Han * version $Id: Calculator.php 1 2011-05-31 * since 1.0 * package OOP * example * */* * 運算符抽象類 * * author Chen Wei Han <csq-3> * package OOP */abstract class Abstract_Operation /* * 定義私有變量 * * var $numa */ private $numa; /* * 定義私有變量 * * var $num

5、b */ private $numb; public function Getnuma() return $this->numa; public function Setnuma($num) $this->numa=$num; public function Getnumb() return $this->numb; public function Setnumb($num) $this->numb=$num; /* * 抽象方法GetResult 返回結(jié)果 */ abstract protected function GetResult();/* * 加法子類 * *

6、 author Chen Wei Han <csq-3> * package OOP */class OperationAdd extends Abstract_Operation public function GetResult() $result = $this->Getnuma() + $this->Getnumb(); return $result; /* * 減法子類 * * author Chen Wei Han <csq-3> * package OOP */class OperationSub extends Abstract_Operat

7、ion public function GetResult() $result = $this->Getnuma() - $this->Getnumb(); return $result; /* * 乘法子類 * * author Chen Wei Han <csq-3> * package OOP */class OperationMul extends Abstract_Operation public function GetResult() $result = $this->Getnuma() * $this->Getnumb(); return $

8、result; /* * 除法子類 * * author Chen Wei Han <csq-3> * package OOP */class OperationDiv extends Abstract_Operation public function GetResult() $result = $this->Getnuma() / $this->Getnumb(); return $result; /* * 運算符工廠類 * * author Chen Wei Han <csq-3> * package OOP */class OperationFact

9、ory /* * 構(gòu)建運算符對象方法 * * param $operation * return class $oper */ public static function GreateOperation($operation) switch ($operation) case 1: $oper = new OperationAdd(); break; case 2: $oper = new OperationSub(); break; case 3: $oper = new OperationMul(); break; case 4: $oper = new OperationDiv();

10、break; default: echo "err!" die(); break; return $oper; /* * 運算主函數(shù) * * param int $firstnum * param int $secondnum * param int $operation * return int $oper->GetResult(); * package OOP */function Calculate($firstnum,$secondnum,$operation) /靜態(tài)調(diào)用 $oper = OperationFactory:GreateOperation($o

11、peration); $oper->Setnuma($firstnum); $oper->Setnumb($secondnum); $oper->GetResult(); return $oper->GetResult();/* * 獲取參數(shù) */$firstnum = intval($_POST'firstnum');$secondnum = intval($_POST'secondnum');$operation = trim($_POST'operation'); echo "計算結(jié)果:".Cal

12、culate($firstnum,$secondnum,$operation);?>靜態(tài)<body><form name="Calculator" id="postform" action="Calculator.php" method="POST"> <div>請輸入第一個參數(shù):<input name="firstnum" type="text"></input></div> <div>

13、;選擇運算符 <select name="operation"> <option value="">請選擇</option> <option value="1">加</option> <option value="2">減</option> <option value="3">乘</option> <option value="4">除</option

14、> </select></div> <div>請輸入第二個參數(shù):<input name="secondnum" type="text"></input></div> <div><input name="submit" type="submit" value="提交"></input></div><form> </body>PHP 設(shè)計模式二之修飾器

15、模式<?phpheader("Content-type: text/html; charset=utf-8"); /* * 人的服飾穿著搭配 裝飾器設(shè)計模式 * 服飾暫定為短袖 短褲 * 定義:在不需要修改原有數(shù)據(jù)模型的基礎(chǔ)上,應(yīng)對需求多變的處理功能。 * author Chen Wei Han <csq-3> * package demo * version $Id: trappings 1 2011-06-01 */* * 實體Person類 * * author Chen Wei Han <csq-3> * package demo */

16、class Person private $Username = "chenweihan" public function setPerson($username) $this->Username = $username; public function decorate() return "搭配穿著的".$this->Username; /* * 抽象服飾修飾類 * * author Chen Wei Han <csq-3> * package demo */abstract class Weartrappings protec

17、ted $value; public function _construct($value) $this->value = $value; abstract public function decorate();/* * 服飾短袖子類 * * author Chen Wei Han <csq-3> * package demo */class Cotta extends Weartrappings public function _construct($value) parent:_construct($value); public function decorate() r

18、eturn "短袖子 ".$this->value->decorate(); /* * 服飾短褲子類 * * author Chen Wei Han <csq-3> * package demo */class Shorts extends Weartrappings public function _construct($value) parent:_construct($value); public function decorate() return "短褲子 ".$this->value->decorate()

19、; $decorate = new Person();$decorate = new Cotta($decorate);$decorate = new Shorts($decorate);echo $decorate->decorate();PHP 設(shè)計模式三之策略設(shè)計模式<?phpheader("Content-type: text/html; charset=utf-8");/* * 商城促銷活動 策略設(shè)計模式 * 促銷活動暫定為 1:100-200返利10% 2:200以上返利20% * * 以前案例中的設(shè)計模式一之工廠模式計算器也可以組合使用策略模式,選

20、擇不同的計算本身就是不同的策略 * Template模式:模板方法模式與策略模式的不同在于,策略模式使用委派的方法提供不同的算法行為,而模板方法使用繼承的方法提供不同的算法行為, * Template模式 特點重在規(guī)范,約束流程。 * * 定義:根據(jù)需求的不同,替換不同的策略對象(邏輯運算等一般在類內(nèi)部)應(yīng)對 * author Chen Wei Han <csq-3> * package demo * version $Id: strategy.php 1 2011-06-01 */* * 促銷活動抽象類 * * author Chen Wei Han <csq-3>

21、* package demo */abstract class abstract_Salespromotion protected $value; public function _construct($value) $this->value = $value; abstract public function GetResult();/* * 促銷活動返利10%子類 * * author Chen Wei Han <csq-3> * package demo */class StrategyRebateA extends abstract_Salespromotion pu

22、blic function _construct($value) parent:_construct($value); public function GetResult() return $this->value*9/10; /* * 促銷活動返利20%子類 * * author Chen Wei Han <csq-3> * package demo */class StrategyRebateB extends abstract_Salespromotion public function _construct($value) parent:_construct($val

23、ue); public function GetResult() return $this->value*4/5; /* * 無促銷活動正常返回 * * author Chen Wei Han <csq-3> * package demo */class StrategyRebateC extends abstract_Salespromotion public function _construct($value) parent:_construct($value); public function GetResult() return $this->value; /

24、* * 調(diào)用策略類 * * author Chen Wei Han <csq-3> * package demo */class UseStrategy /* * 定義策略變量 * * var $result */ private $_strategy; /* * 構(gòu)造函數(shù) * * param $value */ public function _construct($strategy) $this->_strategy = $strategy; /* * 使用策略對象 * */ public function Strategy() return $this->_str

25、ategy->GetResult(); /* * 判斷策略類 * * author Chen Wei Han <csq-3> * package demo */class GetStrategy private $result; private $type; public function BackResult($value) if($value>=100 && $value<=200) $this->type="A" else if($value>200) $this->type="B"

26、else $this->type="C" $ClassName = "StrategyRebate".$this->type; $UseStrategy = new UseStrategy(new $ClassName($value); $this->result = $UseStrategy -> Strategy(); return $this->result; /假設(shè)用戶A購買了100元 用戶B購買了200元$UserA=150;$UserB=250;$getstrategy = new GetStrategy;ech

27、o $getstrategy->BackResult($UserA);echo $getstrategy->BackResult($UserB);PHP 設(shè)計模式四之適配器設(shè)計模式<?phpheader("Content-type:text/html; charset=utf-8");/* * 獲取數(shù)據(jù)格式不同 適配器設(shè)計模式 類適配器(繼承)和對象適配器(委派)推薦使用對象適配器,更能降低耦合關(guān)系,下面案例使用的是對象適配器。 * 獲取數(shù)據(jù)格式暫定為 獲取數(shù)據(jù)的結(jié)構(gòu)大部分已定,原來對象返回的是數(shù)組 現(xiàn)在另外一個接口需要返回json 兩種 * * 區(qū)別裝飾

28、器模式(decorator模式):裝飾模式增強了其他對象的功能而同時又不改變它的接口,適配器模式需要修改擴展接口。 * 裝飾修改的功能一般存在可以疊加,而適配器的一般是不需要的。 * * author Chen Wei Han <csq-3> * package demo * version $Id: adapter.php 1 2011-06-02 */* * 數(shù)據(jù)源角色類 * * author Chen Wei Han <csq-3> * package demo */class Data private $arr = array("1"=>

29、;"a","2"=>"b","3"=>"c"); public function getdata() return $this->arr; /* * 適配器角色接口 */interface interface_Adapter public function backarr(); public function backjson(); /* * 數(shù)組返回格式 數(shù)組類 以前存在的 * * author Chen Wei Han <csq-3> * package dem

30、o */class Backarr private $_data; public function setdata($data) $this->_data = $data; public function GetResult() return $this->_data->getdata(); /* * 數(shù)據(jù)格式返回 json類 現(xiàn)在新加的 * * author Chen Wei Han <csq-3> * package demo */class Adapter implements interface_Adapter private $_adapterarr;

31、private $_data; public function _construct(backarr $backarr_class) $this->_adapterarr = $backarr_class; public function setdata($data) $this->_data = $data; public function backarr() $this->_adapterarr->setdata($this->_data); return $this->_adapterarr->GetResult(); public functi

32、on backjson() return json_encode($this->_data->getdata(); /* * 調(diào)用 */數(shù)據(jù)源$data = new Data();/以前老接口$backarr = new Backarr();/適配器接口 $adapter = new Adapter($backarr);/設(shè)置數(shù)據(jù)源$adapter->setdata($data);/返回數(shù)組格式print_r ($adapter->backarr($data);/返回json格式print_r ($adapter->backjson($data);/* * 如果第

33、三方接口的函數(shù)已經(jīng)定死也就是GetResult,那么你可以繼承Backarr,然后重寫json返回函數(shù)為GetResult,就能完美解決你和第三方的問題。 * 理論是死的,實際應(yīng)用是需要靈活多變的 */PHP 設(shè)計模式五之工廠方法設(shè)計模式<?phpheader("Content-type:text/html;charset=utf-8");/* * 計算器簡單 工廠方法模式 * 目前運算符號暫定為:加減 * 定義:經(jīng)過一定的邏輯,需要實例對應(yīng)的對象對象可以完全不同,經(jīng)常配合策略模式使用這里的對象有相似性 * * 前面設(shè)計模式一的簡單工廠模式與這里的工廠方法模式的區(qū)別

34、* 簡單工廠模式,是在一個工廠類里創(chuàng)建產(chǎn)品類,這里存在一個問題,如果增加產(chǎn)品就會去修改工廠類,違背了開發(fā)-封閉原則 * 工廠方法模式,對應(yīng)產(chǎn)品類是在其工廠子類里創(chuàng)建的,如果增加產(chǎn)品不需要修改以前結(jié)構(gòu),只需要增加一個子類即可,這樣系統(tǒng)更容易擴展,維護,保持結(jié)構(gòu)的穩(wěn)定性 * 當(dāng)然具體的使用,得根據(jù)需求來定,把創(chuàng)建類延遲到相應(yīng)的子類,會有一點效率和資源的小問題。 * 缺點:簡單工廠模式把選擇放在了工廠里 ,但工廠方法把選擇放在工廠外,但還是存在選擇的if或者switch * * author Chen Wei Han <csq-3> * package demo * version $I

35、d: factorymethod.php 1 2011-06-02 */* * 產(chǎn)品(運算符運算結(jié)果)抽象角色類 */abstract class Abstract_Operation /* * 定義私有變量 * * var $numa */ private $numa; /* * 定義私有變量 * * var $numb */ private $numb; public function Getnuma() return $this->numa; public function Setnuma($num) $this->numa=$num; public function Get

36、numb() return $this->numb; public function Setnumb($num) $this->numb=$num; /* * 抽象方法GetResult 返回結(jié)果 * */ abstract protected function GetResult();/* * 加法子類 * */class OperationAdd extends Abstract_Operation public function GetResult() $result = $this->Getnuma() + $this->Getnumb(); return $r

37、esult; /* * 減法子類 * */class OperationSub extends Abstract_Operation public function GetResult() $result = $this->Getnuma() - $this->Getnumb(); return $result; /* * 抽象工廠角色類 * */abstract class abstract_factory abstract public static function GreateClass();/* * 加法工廠子類 * */class FactoryAdd extends

38、abstract_factory public static function GreateClass() return new OperationAdd(); /* * 減法工廠子類 * */class FactorySub extends abstract_factory public static function GreateClass() return new OperationSub(); /* * 運算主函數(shù) * * param int $firstnum * param int $secondnum * param int $operation */function Calcu

39、late($firstnum,$secondnum,$operation) /靜態(tài)調(diào)用 switch ($operation) case 1: $oper = FactoryAdd:GreateClass(); break; case 2: $oper = FactorySub:GreateClass(); break; default: echo "err!" die(); break; $oper->Setnuma($firstnum); $oper->Setnumb($secondnum); $oper->GetResult(); return $o

40、per->GetResult();$firstnum = 1;$secondnum = 1;$operation = 1;echo "計算結(jié)果:".Calculate($firstnum,$secondnum,$operation);PHP 設(shè)計模式六之代理設(shè)計模式 【超級變種:超級動態(tài)代理】一般動態(tài)代理產(chǎn)品 b 或者 產(chǎn)品c 需要滿足代理的接口定義函數(shù)然后就可以動態(tài)引入產(chǎn)品 b 或者 產(chǎn)品c, 調(diào)用對應(yīng)產(chǎn)品的方法超級動態(tài)代理:一切都是動態(tài)的,不受拘束<?php/* * author Chen Wei Han <csq-3> * package de

41、mo * version $Id: strategy.php 1 2011-06-01 */class a public function a1() return "a1" public function a2() return "a2" class b public function b1() return "b1" public function b2() return "b2" class Proxy public function _construct($class) $this->_class=$c

42、lass; public function _call($name,$arguments) eval("$result=$this->_class->".$name."();"); return $result; $a = new a;$b = new b;$proxy = new Proxy($b);echo $proxy->b1();echo $proxy->b2();$proxy = new Proxy($a);echo $proxy->a1();echo $proxy->a2();?>PHP 設(shè)計模式七之

43、原型設(shè)計模式<?php/* * 計算器簡單 原型設(shè)計模式 也叫克隆(復(fù)制)模式【深復(fù)制,淺復(fù)制】 * 此處案例:把工廠方法設(shè)計模式使用原型設(shè)計模式來實現(xiàn)方便理解。為了避免創(chuàng)建一個與產(chǎn)品類層次平等的工廠類層次時,就可以使用原型設(shè)計模式。 * * 定義:Prototype模式允許一個對象再創(chuàng)建另外一個可定制的對象,根本無需知道任何如何創(chuàng)建的細節(jié),用原型實例指定創(chuàng)建對象的種類,并且通過拷貝這些原型創(chuàng)建新的對象. 當(dāng)要實例化的類是在運行時刻指定時,例如,類是通過動態(tài)裝載;或者 為了避免創(chuàng)建一個與產(chǎn)品類層次平行的工廠類層次時; 或者 當(dāng)一個類的實例只能有幾個不同狀態(tài)組合中的一種時。 建立相應(yīng)數(shù)目的

44、原型并克隆它們可能比每次用合適的狀態(tài)手工實例化該類更方便一些。 詳細文章看:2006/01/16/317896.html * author Chen Wei Han * package demo * version $Id: prototype.php 1 2011-06-07 */* * 抽象原型角色 * */interface Prototype public function copy();/* * 算法管理類 */class OperationManager private $arrs=array(); public function set($key,$value) $this-&g

45、t;arrs$key = $value; public function get($key) return $this->arrs$key; /* * 具體的原型對象 算法類 * */class Operation implements Prototype private $_operation; private $str; public function _construct($operation) $this->_operation = $operation; public function copy() return clone $this;/淺拷貝 public funct

46、ion GetResult($numa,$numb) $this->str = $numa.$this->_operation.$numb; eval("$result = ".$this->str.""); return $result; $OM = new OperationManager;$numa=1;$numb=2;$oper='加'$OM->set($oper,new Operation('+'); $object1 = $OM->get($oper)->copy();ech

47、o $object1->GetResult($numa,$numb);$numa=5;$numb=2;$oper='減'$OM->set($oper,new Operation('-');$object2 = $OM->get($oper)->copy();echo $object2->GetResult($numa,$numb); /* 注意:我這里的計算器例子只是為了對應(yīng)設(shè)計模式一的工廠模式計算器方便讀者理解,不是很好的例子。 * 大家可以能注意到了,這里的具體的原型對象 算法類內(nèi)部有不同的,就是加變減了,我這里巧妙使用eval

48、來解決了,但如果業(yè)務(wù)邏輯太多 * 這就很麻煩,所以要使用原型模式一定的子類僅僅在初始化的參數(shù)對象類別上有所不同,內(nèi)部處理必須一樣的才適用。 * 等于就是工廠方法模式無限子類,而且子類內(nèi)部處理基本一樣的情況,原型模式最適合不過了,因為無限子類,工廠方法模式使用不合理了 */PHP 設(shè)計模式八之觀察者設(shè)計模式<?php/* * 訂閱周刊 觀察者設(shè)計模式【這采用PHP的SPL內(nèi)置接口來實現(xiàn),也可以自己定義接口】 * 定義:對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新 * anthor Chen Wei Han <csq-3> *

49、 package demo * version $Id: observer.php 1 2011-06-13 */* * 被觀察者具體角色類,繼承SPL的接口 */class ConcreteSubject implements SplSubject private $_obeservers; private $value; /* * * 觀察者對象角色容器數(shù)組 */ public function _construct() $this->_observers = array(); /* * 增加觀察者對象角色 * param Observer $observer * return arr */ public function attach(SplObserver $observer) /不分類觀察者 return array_push($this->_observers, $observer); /* public function attache(SplObserver $observer,$type) /分類觀察者 使用二維關(guān)聯(lián)數(shù)組,是否允許覆蓋已添加的觀察者可以添加判斷 return $this->_observers$type=$observer; */ /* * 刪除一個注冊了的觀察者對象角色 * param Observer $o

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論