這篇文章主要介紹了關於實現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接口技术实现的运算:我什么运算都不做...只是为了实现'耦合设计模式'...我是出来打酱油的......
相关推荐:
以上是PHP的耦合設計模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!