이 기사에서는 특정 참조 가치가 있는 PHP 구현의 결합 디자인 패턴을 주로 소개합니다. 이제 모든 사람과 공유합니다. 도움이 필요한 친구들이 참조할 수 있습니다.
결합 정도: 프로그램 모듈 간의 연관 및 종속 정도.
설계 과정에서 제안: 이 소프트웨어의 아키텍처를 설계할 때 이 소프트웨어의 논리적 연산 부분(SimpleRouter 클래스)과 출력 부분(SimpleRouterFrame 클래스)이 잘 결합될 수 없다는 것을 발견했습니다. 즉, 출력 기능을 제공하기 위해 프로그램 인터페이스에 대한 참조(SimpleRouterFrame에 대한 참조)를 계층별로 프로그램의 핵심 부분에 전달해야 합니다.
개발 과정에서 제안: 출력 인터페이스(SimpleRouterFrame 클래스)를 일부 수정하는 경우, 특히 일부 메서드 이름을 수정한 후 해당 프로그램의 핵심 부분(SimpleRouter 클래스) 코드도 다음과 같이 수정해야 합니다. 이 새로운 출력 인터페이스에 적응하세요.
문제 원인: 클래스 간의 결합이 너무 빡빡하여 클래스를 수정해야 할 때마다 해당 관련 클래스가 수정된 클래스에 맞게 코드를 수정해야 합니다. 예를 들어 특정 클래스 A는 다른 클래스 B의 공개 메서드를 직접 호출해야 합니다. B가 더 이상 이 메서드를 지원하지 않거나 메서드 이름을 다시 작성하면 A는 이에 맞게 코드를 다시 작성해야 합니다. 또 다른 상황: 특정 클래스 A는 특정 메서드로 클래스 B를 사용해야 하지만 B의 형태가 결정되지 않은 경우 B의 내부 구조가 변경되면 A가 코드를 다시 작성해야 할 수도 있습니다.
이 상황을 피하려면 A와 B 사이의 결합을 줄여야 합니다. 형식에 관계없이 B가 A에 필요한 기능을 계속 구현할 수 있는 한 A는 코드를 다시 작성할 필요가 없습니다. 해결 방법: B로 설정합니다. 일종의 인터페이스 I을 구현하고 I.Method()를 정의합니다. 동시에 A는 과거에 B의 메서드를 호출할 때 I의 메서드를 직접 호출할 수 있으며 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!