這篇文章主要介紹了關於實現PHP的耦合設計模式,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
一個軟體,它具有許多類,類與類之間需要互相調用,一旦某個類與另一個類具有緊密耦合關係的時候,這個軟體的重用性就會大大降低。所以一個軟體的重用性的高低就取決於它的耦合程度的高低。
耦合度:程式模組之間的關聯、依賴程度。
在設計過程中提出:當設計這個軟體的體繫結構的時候,就發現了這個軟體的邏輯運行部分(SimpleRouter類)和輸出部分(SimpleRouterFrame類)不能很好的結合起來。即:我們不得不將程式介面的引用(reference to SimpleRouterFrame)一層一層的傳遞給程式的核心部分,以提供輸出功能。
在開發過程中提出:當我們對輸出介面(SimpleRouterFrame類)進行了一些修改後,特別是某些方法名稱修改後,相應程式核心部分(SimpleRouter類)的代碼也需要重新修改以適應這個新的輸出介面。
問題的原因:類與類之間耦合的過於緊密,以至於每次需要修改一個類,它相應的關聯類別都需要修改代碼來適應這個修改過的類。 比如說:某個類A需要直接顯示的調用另一個類B的public方法,一旦B不再支援這個方法,或者重寫了這個方法名稱,A就需要重新編寫代碼來適應。另一種情況:某類A需要用到具有某種特定方法的類B,但B的形式並不確定,一旦B的內部結構改變,A就可能需要重寫代碼。
為避免這種情況,需要降低A與B之間的耦合度,不論形式如何,只要B仍然能夠實現A所需要的功能,A就不需要重寫代碼, 解決方案:令B實現某種介面I,定義 I.Method(); 同時A在調用B的方法時候直接調用I的方法即可;而從前會將B當作參數傳給A,然後A再調用B的方法的地方
1 { 2 A.AMethod(B b ) { 3 b.BMethod(); 4 /*….*/ 5 } 6 }
修改成:
1 { 2 A.AMethod(I i ) { 3 i.Method(); 4 } 5 }
在這裡,B只需要實現I.Method()方法即可,完全隱藏了實現細節。 按照這種方法,既實現了類與類之間的鬆散耦合,大大增強了類的可重用性。回顧從前學過的設計模式,可以發現,這與Observer模式有相似之處。
下面是一個完整的例子:
001 <?php 002 interface Calculation { 003 function compute($a, $b); 004 } 005 006 class Addition implements Calculation { 007 function compute($a, $b) 008 { 009 return "加法運算結果為:".($a+$b); 010 } 011 } 012 013 class Subtraction implements Calculation { 014 function compute($a, $b) 015 { 016 return "減法運算結果為:".($a-$b); 017 } 018 } 019 020 class Multiplication implements Calculation { 021 function compute($a, $b) 022 { 023 return "乘法運算結果為:".($a*$b); 024 } 025 } 026 027 class pision implements Calculation{ 028 function compute($a, $b) 029 { 030 return "除法運算結果為:".($a/$b); 031 } 032 } 033 034 class Modf implements Calculation { 035 function compute($a, $b) 036 { 037 return "模數運算結果為:".($a % $b); 038 } 039 } 040 041 class Coupling implements Calculation { 042 //這裡直接:public $varl = new LazyDog(); 會出錯。 043 public $varl = null; 044 045 function __construct() 046 { 047 $this->varl = new LazyDog(); 048 } 049 050 function compute($a, $b) 051 { 052 return $this->varl->say(); 053 } 054 } 055 056 /*也可以用繼承的方式實現喲: 057 class Coupling extends LazyDog implements Calculation { 058 function compute($a, $b) 059 { 060 return parent::say(); 061 } 062 } 063 */ 064 065 class LazyDog { 066 function say() 067 { 068 return "我什麼運算都不做...只是為了實現'耦合設計模式'...我是出來打醬油的......"; 069 } 070 } 071 072 class Test { 073 private $one; 074 private $two; 075 public function __construct($x,$y) 076 { 077 $this->one=$x; 078 $this->two=$y; 079 echo "Class Test 初始化:屬性\$one=".$this->one.",屬性\$two=".$this->two."<h />"; 080 } 081 function display(Calculation $a){ 082 return "用PHP介面技術實現的運算:".$a->compute($this->one,$this->two)."<hr/>"; 083 } 084 } 085 086 $t = new Test(96,12); 087 $t1 = new Addition(); 088 $t2 = new Subtraction(); 089 $t3 = new Multiplication(); 090 $t4 = new pision(); 091 $t5 = new Modf(); 092 093 $dog = new Coupling(); 094 095 echo $t->display($t1); 096 echo $t->display($t2); 097 echo $t->display($t3); 098 echo $t->display($t4); 099 echo $t->display($t5); 100 101 echo $t->display($dog); 102 103 ?>
程式運行結果:
1 Class Test 初始化:屬性$one=96,屬性$two=12 2 用PHP介面技術實現的運算:加法運算結果為:108 3 用PHP介面技術實現的運算:減法運算結果為:84 4 用PHP介面技術實現的運算:乘法運算結果為:1152 5 用PHP介面技術實現的運算:除法運算結果為:8 6 用PHP介面技術實現的運算:模數運算結果為:0 7 用PHP介面技術實現的運算:我什麼運算都不做...只是為了實現'耦合設計模式'...我是出來打醬油的......