成都創(chuàng)新互聯(lián)專注于會寧企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城開發(fā)。會寧網(wǎng)站建設(shè)公司,為會寧等地區(qū)提供建站服務(wù)。全流程按需設(shè)計網(wǎng)站,專業(yè)設(shè)計,全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
設(shè)計模式就是一個教你如何利用真實(shí)可靠的設(shè)計來組織你的代碼的模板。
所有的設(shè)計模式都有一些常用的特性:一個標(biāo)識(a name),一個問題陳述(a problem statement)和一個解決方案(a solution)。
1、一個設(shè)計模式的標(biāo)識是重要的,因?yàn)樗鼤屍渌某绦騿T不用進(jìn)行太深入的學(xué)習(xí)就能立刻理解你的代碼的目的(至少通過這個標(biāo)識程序員會很熟悉這個模式)。
2、問題描述是用來說明這個模式的應(yīng)用的領(lǐng)域。
3、解決方案描述了這個模型的執(zhí)行。一個好的設(shè)計模式的論述應(yīng)該覆蓋使用這個模型的優(yōu)點(diǎn)和缺點(diǎn)。
比如,你從店鋪里面買的一件襯衫是一個代碼庫,它的顏色,樣式和大小都由設(shè)計師和廠商決定,但它滿足了你的需求。然而,如果店里面沒有什么衣服適合你,那你就能自己創(chuàng)建自己的襯衫(設(shè)計它的形狀,選擇布料,然后裁縫在一起)。但是如果你不是一個裁縫,你可能會發(fā)現(xiàn)自己很容易的去找一個合適的模式然后按著這個模式去設(shè)計自己的襯衫。使用一個模型,你可以在更少的時間內(nèi)得到一個熟練設(shè)計的襯衫。
php一共有傳統(tǒng)的23種設(shè)計模式,
Interpreter(解釋器模式),F(xiàn)actory(工廠模式),F(xiàn)acade(外觀模式),Decorator(裝飾模式),Builder(建造者模式)
Adapter(適配器模式),Template (模板模式),Command(命令鏈模式),Singleton(單例模式),Observer(觀察者模式)
Strategy(策略模式),Visitor (訪問者模式),Memento (備忘錄模式),Prototype (原型模式),Mediator (中介者模式)
FlyWeight (享元模式),Chain Of Responsibility (職責(zé)鏈模式),Bridge (橋接模式),Proxy (代理模式),State (狀態(tài)模式)
Composite (組合模式),Interator (迭代器模式),DAO(數(shù)據(jù)訪問對象模式),Delegation(委托模式)
其中有五種php常見的設(shè)計模式
1.工廠模式 2.單例模式(單元素模式)3.觀察者模式 4.命令鏈模式 5.策略模式
耦合性(Coupling),也叫耦合度,是對模塊間關(guān)聯(lián)程度的度量。耦合的強(qiáng)弱取決與模塊間接口的復(fù)雜性、調(diào)用模塊的方式以及通過界面?zhèn)魉蛿?shù)據(jù)的多少。模塊間的耦合度是指模塊之間的依賴關(guān)系,包括控制關(guān)系、調(diào)用關(guān)系、數(shù)據(jù)傳遞關(guān)系。模塊間聯(lián)系越多,其耦合性越強(qiáng),同時表明其獨(dú)立性越差。軟件設(shè)計中通常用耦合度和內(nèi)聚度作為衡量模塊獨(dú)立程度的標(biāo)準(zhǔn)。劃分摸塊的一個準(zhǔn)則就是高內(nèi)聚低耦合
工廠模式的最大優(yōu)點(diǎn)在于創(chuàng)建對象上面,就是把創(chuàng)建對象的過程封裝起來,這樣隨時可以產(chǎn)生一個新的對象。
減少代碼進(jìn)行復(fù)制粘帖,耦合關(guān)系重,牽一發(fā)動其他部分代碼。
通俗的說,以前創(chuàng)建一個對象要使用new,現(xiàn)在把這個過程封裝起來了。
假設(shè)不使用工廠模式:那么很多地方調(diào)用類a,代碼就會這樣子創(chuàng)建一個實(shí)例:new a(),假設(shè)某天需要把a(bǔ)類的名稱修改,意味著很多調(diào)用的代碼都要修改。
建立一個工廠(一個函數(shù)或一個類方法)來制造新的對象,它的任務(wù)就是把對象的創(chuàng)建過程都封裝起來,
創(chuàng)建對象不是使用new的形式了。而是定義一個方法,用于創(chuàng)建對象實(shí)例。
工廠方法:
比如你的工廠叫做“香煙工廠”,那么可以有“七匹狼工廠”“中華工廠”等,但是,這個工廠只生廠一種商品:香煙;
抽象工廠:無法描述它到底生產(chǎn)什么產(chǎn)品,它生產(chǎn)很多類型的產(chǎn)品(所以抽象工廠就會生成子工廠)。
你的工廠是綜合型的,是生產(chǎn)“一系列”產(chǎn)品,而不是“一個”,比如:生產(chǎn)“香煙”,還有“啤酒”等。然后它也可以有派生出來的具體的工廠,但這些工廠都是生產(chǎn)這一系列產(chǎn)品,只是可能因?yàn)榈赜虿灰粯樱瑸榱诉m應(yīng)當(dāng)?shù)厝丝谖?,味道也不太一樣?/p>
工廠模式:理解成只生成一種產(chǎn)品的工廠。比如生產(chǎn)香煙的。
工廠方法:工廠的一種產(chǎn)品生產(chǎn)線 。比如鍵盤的生成過程。
< php
/**
* 工廠方法模式
*
* 定義一個用于創(chuàng)建對象的接口,讓子類決定將哪一個類實(shí)例化,使用一個類的實(shí)例化延遲到其子類
*/
/*
class DBFactory
{
public static function create($type)
{
swtich($type)
{
case "MySQL":
return new MysqlDB(); break;
case "Postgre":
return new PostgreDB(); break;
case "Mssql":
return new MssqlDB(); break;
}
}
}
*/
class DBFactory
{
publicstaticfunction create($type)
{
$class=$type."DB";
returnnew$class;
}
}
interface DB
{
publicfunction connect();
publicfunctionexec();
}
class MysqlDB implements DB
{
publicfunction __construct() {
echo"mysql db
";
}
publicfunction connect() {
}
publicfunctionexec() {
}
}
class PostgreDB implements DB
{
publicfunction __construct() {
echo"Postgre db
";
}
publicfunction connect() {
}
publicfunctionexec() {
}
}
class MssqlDB implements DB
{
publicfunction __construct() {
echo"mssql db
";
}
publicfunction connect() {
}
publicfunctionexec() {
}
}
$oMysql= DBFactory::create("Mysql");
$oPostgre= DBFactory::create("Postgre");
$oMssql= DBFactory::create("Mssql");
作為對象的創(chuàng)建模式,單例模式確保某一個類只有一個實(shí)例,而且自行實(shí)例化并向整個系統(tǒng)全局地提供這個實(shí)例。它不會創(chuàng)建實(shí)例副本,而是會向單例類內(nèi)部存儲的實(shí)例返回一個引用。
(1). 需要一個保存類的唯一實(shí)例的靜態(tài)成員變量:private static $_instance;
(2). 構(gòu)造函數(shù)和克隆函數(shù)必須聲明為私有的,防止外部程序new類從而失去單例模式的意義:
private function __construct()
{
$this->_db = pg_connect('xxxx');
}
private function __clone()
{
}
(3). 必須提供一個訪問這個實(shí)例的公共的靜態(tài)方法(通常為getInstance方法),從而返回唯一實(shí)例的一個引用:
public static function getInstance()
{
if(! (self::$_instance instanceof self) )
{
self::$_instance = new self();
}
return self::$_instance;
}
為什么要使用PHP單例模式?
1、php的應(yīng)用主要在于數(shù)據(jù)庫應(yīng)用, 所以一個應(yīng)用中會存在大量的數(shù)據(jù)庫操作, 使用單例模式, 則可以避免大量的new 操作消耗的資源。
2、如果系統(tǒng)中需要有一個類來全局控制某些配置信息, 那么使用單例模式可以很方便的實(shí)現(xiàn).
觀察者模式定義對象的 一對多 依賴,這樣一來,當(dāng)一個對象改變狀態(tài)時,它的所有依賴者都會收到通知并自動更新!
在觀察者模式中,會改變的是主題的狀態(tài)以及觀察者的數(shù)目。用這個模式,你可以改變依賴于主題狀態(tài)的對象,卻不必改變主題?!页龀绦蛑袝兓姆矫妫缓髮⑵浜凸潭ú蛔兊姆矫嫦喾蛛x!
主題和觀察者都使用接口:觀察者利用主題的接口向主題注冊,而主題利用觀察者接口通知觀察者。這樣可以讓兩者之間運(yùn)作正常,又同時具有松耦合的優(yōu)點(diǎn)! ——針對接口編程,不針對實(shí)現(xiàn)編程!
觀察者模式利用“組合”將許多觀察者組合進(jìn)主題中。對象(觀察者——主題)之間的這種關(guān)系不是通過繼承產(chǎn)生的,而是在運(yùn)行時利用組合的方式產(chǎn)生的。 ——多用組合,少用繼承!
/**
* 觀察者模式
* @author: Mac
* @date: 2012/02/22
*/
class Paper{ /* 主題 */
private $_observers = array();
public function register($sub){ /* 注冊觀察者 */
$this->_observers[] = $sub;
}
public function trigger(){ /* 外部統(tǒng)一訪問 */
if(!empty($this->_observers)){
foreach($this->_observers as $observer){
$observer->update();
}
}
}
}
/**
* 觀察者要實(shí)現(xiàn)的接口
*/
interface Observerable{
public function update();
}
class Subscriber implements Observerable{
public function update(){
echo "Callback\n";
}
}
/* 測試 */
$paper = new Paper();
$paper->register(new Subscriber());
//$paper->register(new Subscriber1());
//$paper->register(new Subscriber2());
$paper->trigger();
當(dāng)新對象要填入的時候,只需要在主題(又叫可觀察者)中進(jìn)行注冊(注冊方式很多,你也可以在構(gòu)造的時候,或者框架訪問的接口中進(jìn)行注冊),然后實(shí)現(xiàn)代碼直接在新對象的接口中進(jìn)行。這降低了主題對象和觀察者對象的耦合度。
命令鏈模式以松散耦合主題為基礎(chǔ),發(fā)送消息、命令和請求,或通過一組處理程序發(fā)送任意內(nèi)容。每個處理程序都會自行判斷自己能否處理請求。如果可以,該請求被處理,進(jìn)程停止。您可以為系統(tǒng)添加或移除處理程序,而不影響其他處理程序。
1.interface Validator
2.{
3. /**
4. * The method could have any parameters.
5. * @param mixed
6. * @return boolean
7. */
8. public function isValid($value);
9.}
10.
11./**
12. * ConcreteCommand.
13. */
14.class MoreThanZeroValidator implements Validator
15.{
16. public function isValid($value)
17. {
18. return $value > 0;
19. }
20.}
21.
22./**
23. * ConcreteCommand.
24. */
25.class EvenValidator implements Validator
26.{
27. public function isValid($value)
28. {
29. return $value % 2 == 0;
30. }
31.}
32.
33./**
34. * The Invoker. An implementation could store more than one
35. * Validator if needed.
36. */
37.class ArrayProcessor
38.{
39. protected $_rule;
40.
41. public function __construct (Validator $rule)
42. {
43. $this->_rule = $rule;
44. }
45.
46. public function process(array $numbers)
47. {
48. foreach ($numbers as $n) {
49. if ($this->_rule->IsValid($n)) {
50. echo $n, "\n";
51. }
52. }
53. }
54.}
55.
56.// Client code
57.$processor = new ArrayProcessor(new EvenValidator());
58.$processor->process(array(1, 20, 18, 5, 0, 31, 42));
策略模式是對象的行為模式,用意是對一組算法的封裝。動態(tài)的選擇需要的算法并使用。
策略模式指的是程序中涉及決策控制的一種模式。策略模式功能非常強(qiáng)大,因?yàn)檫@個設(shè)計模式本身的核心思想就是面向?qū)ο缶幊痰亩嘈涡运枷搿?/p>
“對于面向?qū)ο蟮某绦蛟O(shè)計語言,多型性是第三種最基本的特征(前兩種是數(shù)據(jù)抽象和繼承?!?/p>
“多形性”(Polymorphism)從另一個角度將接口從具體的實(shí)施細(xì)節(jié)中分離出來,亦即實(shí)現(xiàn)了“是什么”與“怎樣做”兩個模塊的分離。利用多形性的概念,代碼的組織以及可讀性均能獲得改善。此外,還能創(chuàng)建“易于擴(kuò)展”的程序。無論在項(xiàng)目的創(chuàng)建過程中,還是在需要加入新特性的時候,它們都可以方便地“成長”。
策略模式的三個角色:
1.抽象策略角色
2.具體策略角色
3.環(huán)境角色(對抽象策略角色的引用)
實(shí)現(xiàn)步驟:
1.定義抽象角色類(定義好各個實(shí)現(xiàn)的共同抽象方法)
2.定義具體策略類(具體實(shí)現(xiàn)父類的共同方法)
3.定義環(huán)境角色類(私有化申明抽象角色變量,重載構(gòu)造方法,執(zhí)行抽象方法)
策略模式的代碼實(shí)例:
< php
abstract class baseAgent { //抽象策略類
abstract function PrintPage();
}
//用于客戶端是IE時調(diào)用的類(環(huán)境角色)
class ieAgent extends baseAgent {
function PrintPage() {
return 'IE';
}
}
//用于客戶端不是IE時調(diào)用的類(環(huán)境角色)
class otherAgent extends baseAgent {
function PrintPage() {
return 'not IE';
}
}
class Browser { //具體策略角色
public function call($object) {
return $object->PrintPage ();
}
}
$bro = new Browser ();
echo $bro->call ( new ieAgent () );
>
就在編程領(lǐng)域之外,有許多例子是關(guān)于策略模式的。例如:
如果我需要在早晨從家里出發(fā)去上班,我可以有幾個策略考慮:我可以乘坐地鐵,乘坐公交車,走路或其它的途徑。每個策略可以得到相同的結(jié)果,但是使用了不同的資源。