首頁  >  文章  >  後端開發  >  PHP的耦合設計模式

PHP的耦合設計模式

不言
不言原創
2018-04-28 13:42:462127瀏覽

這篇文章主要介紹了關於實現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 "我什么运算都不做...只是为了实现&#39;耦合设计模式&#39;...我是出来打酱油的......";    
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接口技术实现的运算:我什么运算都不做...只是为了实现&#39;耦合设计模式&#39;...我是出来打酱油的......

相关推荐:

PHP的标准库


以上是PHP的耦合設計模式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn