>백엔드 개발 >PHP 튜토리얼 >PHP의 결합된 디자인 패턴

PHP의 결합된 디자인 패턴

不言
不言원래의
2018-04-28 13:42:462173검색

이 기사에서는 특정 참조 가치가 있는 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 "我什么运算都不做...只是为了实现&#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으로 문의하세요.
이전 기사:PHP 공통 함수 모음다음 기사:PHP 공통 함수 모음