php 디자인 모드의 의뢰 모드

5827 단어
위탁 모델은 소프트웨어 디자인 모델 중의 기본적인 기교이다.위탁 모드에서 두 대상이 같은 요청을 처리하는 데 참여하고 요청을 받은 대상은 요청을 다른 대상에게 위탁하여 처리한다.위탁 모델은 기본적인 기교로 많은 다른 모델, 예를 들어 상태 모델, 전략 모델, 방문자 모델은 본질적으로 더욱 특수한 장소에서 위탁 모델을 채택했다.동적 의뢰에 대한 소개: 동적 의뢰 개념은 Jakarta 바이트 코드 프로젝트 라이브러리(Byte-Code Engineering Library,BCEL)에서 나온다.존재하는 클래스를 분석할 수 있고 인터페이스, 추상 클래스, 심지어 실행할 때의 구체적인 클래스에 대해 바이트 인코딩 의뢰 클래스를 생성할 수 있다.위탁된 인터페이스/클래스는 다음과 같은 조건을 만족시켜야 한다. 동적 위탁은 최대 한 클래스만 위탁할 수 있지만 여러 인터페이스를 대리할 수 있다.이 제한은 Java의 단일 상속 모드에서 나온 것입니다.Java 클래스는 상위 클래스가 하나일 수 있습니다.생성된 위탁류가 피위탁류를 부류로 하는 이상 여러 개의 피위탁류를 지정하는 것은 불합리하다.위임된 클래스가 지정되지 않은 경우 기본 상위 클래스는 Object입니다.다음은 PHP 반사 메커니즘이 동적 에이전트를 구현하는 코드입니다.

target[] = new Fruit();
  }
  
  function __call($name, $args)

  {
    foreach ($this->target as $obj)
    {
      $r = new ReflectionClass($obj);
      if ($method = $r->getMethod($name))

      {

        if ($method->isPublic() && !$method->isAbstract())
        {

          return $method->invoke($obj, $args);
        }

      }

    }
  }

}

$obj = new FruitDelegator();

$obj->callFruit();

//  

// Generate an Apple
?>


프록시 클래스인 FruitDelegator를 통해 Fruit 클래스를 대체하는 방법을 알 수 있다.마찬가지로 다음과 같은 코드도 실행할 수 있다.

target[] = $obj;

  }

   

  function __call($name, $args)

  {

    foreach ($this->target as $obj)

    {

      $r = new ReflectionClass($obj);

      if ($method = $r->getMethod($name))

      {

        if ($method->isPublic() && !$method->isAbstract())

        {
          return $method->invoke($obj, $args);
        }
      }
    }
  }
}

$obj = new ColorDelegator();
$obj->addObject(new Color());
$obj->callColor();

?>



하나의 cd클래스를 설계했다. 클래스에 mp3 재생 모드가 있고 mp4 재생 모드가 개선되기 전에 cd클래스의 재생 모드를 사용하면 실례화된 클래스에서 어떤 방식을 선택했는지 판단해야 한다. 재생 모드를 매개 변수로 플레이리스트 함수에 전송하면 재생에 필요한 방법을 자동으로 찾을 수 있다.
1. 미개선 전

cdInfo[$song] = $song; 
 } 
  
 public function playMp3($song) { 
  return $this->cdInfo[$song] . '.mp3'; 
 } 
  
 public function playMp4($song) { 
  return $this->cdInfo[$song] . '.mp4'; 
 } 
} 
$oldCd = new cd; 
$oldCd->addSong("1"); 
$oldCd->addSong("2"); 
$oldCd->addSong("3"); 
$type = 'mp3'; 
if ($type == 'mp3') { 
 $oldCd->playMp3(); 
} else { 
 $oldCd->playMp4(); 
}

2. 위탁 모드를 통해 개선된 cd류

cdInfo[$song] = $song;
 }
 
 public function play($type,$song){
  $name = '\Tools\\'.$type;
  $obj = new $name;
  return $obj->playList($this->cdInfo,$song);
 }
}
 
$newCd = new cdDelegate();
$newCd->addSong("1");
$newCd->addSong("2");
$newCd->addSong("3");
echo $newCd->play('mp3','1');// 

실례를 하나 더 알려드리겠습니다.

_object = new $object();
 }
 
 function addSong($location,$title)
 {
  $this->_songs[] = array("location"=>$location,"title"=>$title);
 }
 
 function getPlayList()
 {
  return $this->_object->getPlayList($this->_songs);
 }
}
 
class mp3PlayListDelegation
{
 function getPlayList($songs)
 {
  $aResult = array();
  foreach($songs as $key=>$item)
  {
   $path = pathinfo($item['location']);
   if(strtolower($item['extension']) == "mp3")
   {
    $aResult[] = $item;
   }
  }
  return $aResult;
 }
}
 
class rmvbPlayListDelegation
{
 function getPlayList($songs)
 {
  $aResult = array();
  foreach($songs as $key=>$item)
  {
   $path = pathinfo($item['location']);
   if(strtolower($item['extension']) == "rmvb")
   {
    $aResult[] = $item;
   }
  }
  return $aResult;
 }
}
 
$oMP3PlayList = new PlayList("mp3");
$oMP3PlayList->getPlayList();
$oRMVBPlayList = new PlayList("rmvb");
$oRMVBPlayList->getPlayList();
?>

이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되었으면 합니다.

좋은 웹페이지 즐겨찾기