ホームページ >バックエンド開発 >PHPチュートリアル >PHP の結合設計パターン
この記事では主に PHP の実装のカップリング設計パターンを紹介します。これを必要な友達に共有します。
結合度: プログラムモジュール間の関連性と依存性の度合い。
設計過程での提案: このソフトウェアのアーキテクチャを設計する際、このソフトウェアの論理演算部分 (SimpleRouter クラス) と出力部分 (SimpleRouterFrame クラス) をうまく組み合わせることができないことがわかりました。つまり、出力関数を提供するには、プログラム インターフェイスへの参照 (SimpleRouterFrame への参照) を層ごとにプログラムのコア部分に渡す必要があります。
開発プロセス中に提案: 出力インターフェイス (SimpleRouterFrame クラス) にいくつかの変更を加えた場合、特にいくつかのメソッド名が変更された後、対応するプログラムのコア部分 (SimpleRouter クラス) のコードも次のように変更する必要があります。この新しい出力インターフェイスに適応します。
問題の原因: クラス間の結合が強すぎるため、クラスを変更する必要があるたびに、対応する関連クラスは、変更されたクラスに適応するようにコードを変更する必要があります。 たとえば、あるクラス A は、別のクラス B のパブリック メソッドを直接呼び出す必要があります。B がこのメソッドをサポートしなくなるか、メソッド名を書き換えると、A はそれに適応するようにコードを書き直す必要があります。別の状況: あるクラス A は特定のメソッドでクラス B を使用する必要がありますが、B の内部構造が変更されると、A はコードを書き直す必要がある場合があります。
この状況を回避するには、A と B の間の結合を減らす必要があります。形式に関係なく、B が A に必要な機能を実装できる限り、A はコードを書き直す必要はありません。 解決策: B を書き直す必要はありません。ある種のインターフェイス I を実装し、I.Method() を定義します。同時に、A は以前に B のメソッドを呼び出すときに、B をパラメータとして 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 中国語 Web サイトの他の関連記事を参照してください。