>  기사  >  백엔드 개발  >  PHP에서 일반적으로 사용되는 세 가지 디자인 패턴에 대한 연구 노트

PHP에서 일반적으로 사용되는 세 가지 디자인 패턴에 대한 연구 노트

WBOY
WBOY원래의
2016-07-25 09:05:46842검색
  1. class SingetonBasic {

  2. private static $instance;

  3. < p>// 기타 변수..

  4. 비공개 함수 __construct() {

  5. // 구성 수행..
  6. }

  7. public static function getInstance() {

  8. if (!(self::$instance instanceof self)) {
  9. self:: $instance = new self();
  10. }
  11. return self::$instance;
  12. }

  13. // 기타 기능..

  14. }< /p>
  15. $a = SingetonBasic::getInstance();

  16. $b = SingetonBasic::getInstance();
  17. var_dump($a === $b);
코드 복사

2. 공장 모드 팩토리 패턴을 사용하면 입력 매개변수 또는 애플리케이션 구성을 기반으로 다른 클래스의 인스턴스를 구현하고 반환하도록 특별히 설계된 클래스를 만들 수 있습니다. 팩토리 패턴의 예:

  1. class FactoryBasic {
  2. 공용 정적 함수 생성($config) {
  3. }

  4. }

코드 복사

예를 들어 다음은 다음과 같습니다. 전달된 매개변수 수에 따라 다양한 모양을 생성하려는 모양 개체 팩토리.

  1. // 모양의 공개 기능을 정의합니다. 주 길이와 면적을 구합니다.

  2. 인터페이스 IShape {
  3. function getCircum();
  4. function getArea();
  5. }

  6. // 직사각형 클래스 정의

  7. class Rectangle은 IShape를 구현합니다. {
  8. 비공개 $width, $height;

  9. 공용 함수 __construct($width, $height) {

  10. $this->width = $width;
  11. $this->height = $height;
  12. }

  13. public function getCircum() {

  14. return 2 * ($this->width $this-> height);
  15. }

  16. public function getArea() {

  17. return $this->width * $this->height;
  18. }
  19. }

  20. //원 클래스 정의

  21. class Circle은 IShape를 구현합니다. {
  22. private $radii;

  23. public 함수 __construct($ radii) {

  24. $this->radii = $radii;
  25. }

  26. public function getCircum() {

  27. return 2 * M_PI * $this-> ;radii;
  28. }

  29. public function getArea() {

  30. return M_PI * pow($this->radii, 2);
  31. }
  32. }

  33. // 전달된 매개변수 수에 따라 다양한 모양을 만듭니다.

  34. class FactoryShape {
  35. public static function create() {
  36. switch (func_num_args()) {
  37. case 1:
  38. return new Circle(func_get_arg(0));
  39. break;
  40. 사례 2:
  41. 새 직사각형 반환(func_get_arg(0), func_get_arg(1));
  42. break;

  43. }

  44. }
  45. }
  46. // 직사각형 객체

  47. $c = FactoryShape::create(4, 2);
  48. var_dump($c->getArea());
  49. // 원 객체
  50. $o = FactoryShape::create(2);
  51. var_dump($o->getArea());

코드 복사

팩토리 패턴을 사용하면 클래스와 메서드가 하나만 있기 때문에 메서드 호출이 더 쉽습니다. 팩토리 패턴을 사용하지 않는 경우 팩토리를 사용할 때 어떤 클래스와 메서드를 호출할지 결정해야 합니다. 예를 들어, 모양에 대한 지원을 추가하려면 팩토리 패턴을 사용하는 대신 팩토리 클래스의 create() 메서드만 수정하면 됩니다. 모양을 호출하는 코드 블록을 수정해야 합니다.

3. 관찰자 모드 관찰자 패턴은 구성 요소 간의 긴밀한 결합을 방지하는 또 다른 방법을 제공합니다. 패턴은 매우 간단합니다. 객체는 다른 객체인 관찰자가 자신을 등록할 수 있도록 허용하는 메서드를 추가하여 객체 자체를 관찰 가능하게 만듭니다. 관찰 가능한 객체가 변경되면 등록된 관찰자에게 메시지를 보냅니다. 이러한 관찰자는 이 정보를 사용하여 관찰 가능한 객체와 독립적인 작업을 수행합니다. 결과적으로 객체는 이유를 이해하지 않고도 서로 대화할 수 있습니다.

간단한 예: 청취자가 라디오를 듣고 있을 때(즉, 라디오가 새로운 청취자와 합류하는 경우) 메시지를 보낸 로그 관찰자가 이를 관찰할 수 있는 프롬프트 메시지를 보냅니다.

  1. // 관찰자 인터페이스
  2. 인터페이스 IObserver {
  3. 함수 onListen($ sender , $args);
  4. function getName();
  5. }

  6. // 관찰 가능한 인터페이스

  7. 인터페이스 IObservable {
  8. function addObserver($observer );
  9. function RemoveObserver($observer_name);
  10. }

  11. // Observer 클래스

  12. 추상 클래스 Observer는 IObserver를 구현합니다. {
  13. 보호된 $name;< ;/p>
  14. public function getName() {

  15. return $this->name;
  16. }
  17. }

  18. // 관찰 가능 클래스

  19. class Observable은 IObservable을 구현합니다. {
  20. protected $observers = array();

  21. public function addObserver($observer) {

  22. if (!( $observer instanceof IObserver)) {
  23. return;
  24. }
  25. $this->observers[] = $observer;
  26. }

  27. 공용 함수 RemoveObserver($observer_name) {

  28. foreach ($this->observers as $index => $observer) {
  29. if ($observer->getName() === $observer_name) {
  30. array_splice ($this-> 관찰자, $index, 1);
  31. return;
  32. }
  33. }
  34. }
  35. }

  36. // 시뮬레이션 관찰할 수 있는 클래스 : RadioStation

  37. class RadioStation은 Observable {

  38. public function addListener($listener) {

  39. foreach ($this->observers as $observer ) {
  40. $를 확장합니다 관찰자->onListen($this, $listener);
  41. }
  42. }
  43. }

  44. // 관찰자 클래스 시뮬레이션

  45. class RadioStationLogger는 관찰자를 확장합니다. {
  46. protected $name = 'logger';

  47. public function onListen($sender, $args) {

  48. echo $args, ' 라디오 방송국에 참여하세요.
    ';
  49. }
  50. }

  51. // 다른 관찰자 클래스 시뮬레이션

  52. class OtherObserver는 관찰자 {
  53. protected $name = 'other';
  54. 공개 함수 onListen($sender, $args) {
  55. echo '다른 관찰자..
    ';
  56. }
  57. }< /p>
  58. // 관찰자 삽입

  59. $rs->addObserver(new RadioStationLogger()) ;
  60. $rs->addObserver (new OtherObserver());

  61. // 관찰자 제거

  62. $rs->removeObserver('other')

  63. // 관찰된 정보를 볼 수 있습니다

  64. $rs->addListener('cctv');
  65. ?>

코드 복사


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.