Php 디자인 모델 (3): 행동 형 모델 part 2

22927 단어 디자인 모드
원문 상세 참조: http://www.ucai.cn/blogdetail/7023?mid=1&f=5
온라인 으로 실행 하여 효 과 를 볼 수 있 습 니 다!   
《 윗글 을 잇다 》.
5. 중개 자 모드 (Mediator):
      중개 대상 으로 일련의 대상 의 상호작용 을 밀봉 하고 중 개 는 각 대상 이 명시 적 으로 서로 인용 할 필요 가 없 게 한다.우체국 과 비슷 하 게 우송 자 와 수신 자 는 스스로 먼 길 을 가지 않 고 우체국 을 통과 하면 된다.
      장점: 대상 간 의 관 계 를 간소화 하고 하위 클래스 의 생 성 을 줄인다.
      단점: 중개 대상 이 매우 복잡 해 지고 시스템 을 유지 하기 어 려 울 수 있 습 니 다.
      응용 장면: 상호작용 을 표시 할 필요 가 없습니다.
코드 구현:
<?php



/**

 *           

 *

 *       Mediator

 *

 * @author            

 * @see http://www.ucai.cn

 */





function output($string) {

    echo    $string . "
"; } abstract class Mediator { // abstract public function send($message,$colleague); } abstract class Colleague { // private $_mediator = null; public function __construct($mediator) { $this->_mediator = $mediator; } public function send($message) { $this->_mediator->send($message,$this); } abstract public function notify($message); } class ConcreteMediator extends Mediator { // private $_colleague1 = null; private $_colleague2 = null; public function send($message,$colleague) { if($colleague == $this->_colleague1) { $this->_colleague1->notify($message); } else { $this->_colleague2->notify($message); } } public function set($colleague1,$colleague2) { $this->_colleague1 = $colleague1; $this->_colleague2 = $colleague2; } } class Colleague1 extends Colleague { // public function notify($message) { output(sprintf('Colleague-1: %s', $message)); } } class Colleague2 extends Colleague { // public function notify($message) { output(sprintf('Colleague-2: %s', $message)); } } class Client { public static function test(){ // client $objMediator = new ConcreteMediator(); $objC1 = new Colleague1($objMediator); $objC2 = new Colleague2($objMediator); $objMediator->set($objC1,$objC2); $objC1->send("to c2 from c1"); $objC2->send("to c1 from c2"); } } Client::test();

  
6. 상태 모드 (State):
     대상 은 서로 다른 상태 에서 서로 다른 행 위 를 보인다.여자친 구 처럼 당신 의 손 을 잡 는 것 이 기 쁘 고 개 를 산책 시 키 는 것 이 기 쁘 지 않 습 니 다.두 가지 상태 에서 서로 다른 행 위 를 드러내다.
     장점: if 문장 이 실 용적 이지 않도록 새로운 상 태 를 증가 시 키 고 상태 전환 규칙 을 봉인 합 니 다.
     단점: 시스템 류 와 대상 의 수 를 늘린다.
     응용 장면: 대상 의 서로 다른 기능 의 전환 에 사용 합 니 다.
코드 구현:
<?php



/**

 *           

 *

 *      State

 *

 * @author            

 * @see http://www.ucai.cn

 */



function output($string) {

    echo    $string . "
"; } abstract class ILift { // const OPENING_STATE = 1; // const CLOSING_STATE = 2; // const RUNNING_STATE = 3; // const STOPPING_STATE = 4; // ; // public abstract function setState($state); // public abstract function open(); // , public abstract function close(); // , public abstract function run(); // public abstract function stop(); } /** * */ class Lift extends ILift { private $state; public function setState($state) { $this->state = $state; } // public function close() { // switch ($this->state) { case ILift::OPENING_STATE: // , $this->setState(ILift::CLOSING_STATE); break; case ILift::CLOSING_STATE: // , //do nothing; return ; break; case ILift::RUNNING_STATE: // , , //do nothing; return ; break; case ILift::STOPPING_STATE: // , , //do nothing; return ; break; } output('Lift colse'); } // public function open() { // switch($this->state){ case ILift::OPENING_STATE: // , //do nothing; return ; break; case ILift::CLOSING_STATE: // , $this->setState(ILift::OPENING_STATE); break; case ILift::RUNNING_STATE: // , , //do nothing; return ; break; case ILift::STOPPING_STATE: // , $this->setState(ILift::OPENING_STATE); break; } output('Lift open'); } /// public function run() { switch($this->state){ case ILift::OPENING_STATE: // , , //do nothing; return ; break; case ILift::CLOSING_STATE: // , $this->setState(ILift::RUNNING_STATE); break; case ILift::RUNNING_STATE: // , //do nothing; return ; break; case ILift::STOPPING_STATE: // , $this->setState(ILift::RUNNING_STATE); } output('Lift run'); } // public function stop() { switch($this->state){ case ILift::OPENING_STATE: // , , //do nothing; return ; break; case ILift::CLOSING_STATE: // , $this->setState(ILift::CLOSING_STATE); break; case ILift::RUNNING_STATE: // , $this->setState(ILift::CLOSING_STATE); break; case ILift::STOPPING_STATE: // , //do nothing; return ; break; } output('Lift stop'); } } class Client { public static function test() { $lift = new Lift(); // $lift->setState(ILift::STOPPING_STATE); // , $lift->open(); // $lift->close(); // , , $lift->run(); // , $lift->stop(); } } Client::test();

  
<?php



/**

 *           

 *

 *      State

 *

 * @author            

 * @see http://www.ucai.cn

 */



function output($string) {

    echo    $string . "
"; } /** * * */ abstract class LiftState{ // , protected $_context; public function setContext(Context $context){ $this->_context = $context; } // public abstract function open(); // , public abstract function close(); // , public abstract function run(); // , public abstract function stop(); } /** * : 。 ConcreteState , 。 */ class Context { // static $openningState = null; static $closeingState = null; static $runningState = null; static $stoppingState = null; public function __construct() { self::$openningState = new OpenningState(); self::$closeingState = new ClosingState(); self::$runningState = new RunningState(); self::$stoppingState = new StoppingState(); } // private $_liftState; public function getLiftState() { return $this->_liftState; } public function setLiftState($liftState) { $this->_liftState = $liftState; // $this->_liftState->setContext($this); } public function open(){ $this->_liftState->open(); } public function close(){ $this->_liftState->close(); } public function run(){ $this->_liftState->run(); } public function stop(){ $this->_liftState->stop(); } } /** * */ class OpenningState extends LiftState { /** * , * */ public function close() { // $this->_context->setLiftState(Context::$closeingState); // CloseState $this->_context->getLiftState()->close(); } // public function open() { output('lift open...'); } // , , ! public function run() { //do nothing; } // ? public function stop() { //do nothing; } } /** * , */ class ClosingState extends LiftState { // , public function close() { output('lift close...'); } // , , public function open() { $this->_context->setLiftState(Context::$openningState); // $this->_context->getLiftState()->open(); } // , public function run() { $this->_context->setLiftState(Context::$runningState); // ; $this->_context->getLiftState()->run(); } // , public function stop() { $this->_context->setLiftState(Context::$stoppingState); // ; $this->_context->getLiftState()->stop(); } } /** * */ class RunningState extends LiftState { // ? public function close() { //do nothing } // ? ! public function open() { //do nothing } // public function run() { output('lift run...'); } // , ?! public function stop() { $this->_context->setLiftState(Context::$stoppingState); // ; $this->_context->getLiftState()->stop(); } } /** * */ class StoppingState extends LiftState { // ? ! public function close() { //do nothing; } // , , ! public function open() { $this->_context->setLiftState(Context::$openningState); $this->_context->getLiftState()->open(); } // , public function run() { $this->_context->setLiftState(Context::$runningState); $this->_context->getLiftState()->run(); } // ? public function stop() { output('lift stop...'); } } /** * */ class Client { public static function test() { $context = new Context(); $context->setLiftState(new ClosingState()); $context->open(); $context->close(); $context->run(); $context->stop(); } } Client::test();

 
7. 직책 체인 모델 (책임 체인):
      여러 대상 이 요청 을 처리 할 기회 가 있 습 니 다. 요청 발송 자 와 수신 자 를 위해 결합 을 해제 합 니 다.은행 의 현금인출기 처럼 그것 을 막론하고 돈 을 찾 을 수 있다.
      장점: 대상 의 숨겨 진 체인 구 조 를 단순화 하여 새로운 직책 노드 를 추가 하기 쉽다.
      단점: 요청 이 수용자 가 없 거나 여러 수신 자 에 의 해 호출 되 어 성능 이 떨 어 질 수 있 습 니 다.
      응용 장면: 여러 가지 요청 을 처리 합 니 다.
코드 구현:
 
<?php



/**

 *           

 *

 *       Chain of Responsibility

 *

 * @author            

 * @see http://www.ucai.cn

 */



function output($string) {

    echo    $string . "
"; } /** * , 0.5 , leader OK 。    0.5<= <=3 , leader , 。    3< , leader , , , 10 , 。 */ /** * (Handler:Approver): , ( ) * */ abstract class Handler { protected $_handler = null; protected $_handlerName = null; public function setSuccessor($handler) { $this->_handler = $handler; } protected function _success($request) { output(sprintf("%s's request was passed", $request->getName())); return true; } abstract function handleRequest($request); } /** * (ConcreteHandler:President): , , , 。 * */ class ConcreteHandlerLeader extends Handler { function __construct($handlerName){ $this->_handlerName = $handlerName; } public function handleRequest($request) { if($request->getDay() < 0.5) { output(sprintf('%s was told', $this->_handlerName)); // leader return $this->_success($request); } if ($this->_handler instanceof Handler) { return $this->_handler->handleRequest($request); } } } /** * Manager * */ class ConcreteHandlerManager extends Handler { function __construct($handlerName){ $this->_handlerName = $handlerName; } public function handleRequest($request) { if(0.5 <= $request->getDay() && $request->getDay()<=3) { output(sprintf('%s signed', $this->_handlerName)); // return $this->_success($request); } if ($this->_handler instanceof Handler) { return $this->_handler->handleRequest($request); } } } class ConcreteHandlerGeneralManager extends Handler { function __construct($handlerName){ $this->_handlerName = $handlerName; } public function handleRequest($request) { if(3 < $request->getDay() && $request->getDay() < 10){ output(sprintf('%s signed', $this->_handlerName)); // return $this->_success($request); } if ($this->_handler instanceof Handler) { return $this->_handler->handleRequest($request); } else { output(sprintf('no one can approve request more than 10 days')); } } } /** * * */ class Request { private $_name; private $_day; private $_reason; function __construct($name= '', $day= 0, $reason = ''){ $this->_name = $name; $this->_day = $day; $this->_reason = $reason; } public function setName($name){ $this->_name = $name; } public function getName(){ return $this->_name; } public function setDay($day){ $this->_day = $day; } public function getDay(){ return $this->_day ; } public function setReason($reason ){ $this->_reason = $reason; } public function getReason( ){ return $this->_reason; } } class Client { public static function test(){ $leader = new ConcreteHandlerLeader('leader'); $manager = new ConcreteHandlerManager('manager'); $generalManager = new ConcreteHandlerGeneralManager('generalManager'); // $request = new Request('ucai',4,' '); $leader->setSuccessor($manager); $manager->setSuccessor($generalManager); $result = $leader->handleRequest($request); } } Client::test();

  
8. 전략 모델 (Strategy):
      일련의 알고리즘 을 정의 하고 모든 알고리즘 을 봉 하여 서로 바 꿀 수 있 도록 합 니 다.농구 팀 의 선수 들 처럼 경기장 과 장 하 는 휴식 을 취한 다.감독 은 코트 를 내 려 놓 을 수도 있 고, 코트 를 내 려 놓 을 수도 있다.
      장점: 재 활용 가능 한 일련의 알고리즘 과 행 위 를 정의 하고 if else 문 구 를 제거 합 니 다.
      단점: 호출 단 은 모든 전략 류 를 알 아야 합 니 다.
      응용 장면: 대상 간 의 교체 에 사용 합 니 다.
코드 구현:
<?php



/**

 *           

 *

 *      Strategy

 *

 * @author            

 * @see http://www.ucai.cn

 */





function output($string) {

    echo    $string . "
"; } // interface IStrategy { public function OnTheWay(); } class WalkStrategy implements IStrategy { public function OnTheWay() { output( ' '); } } class RideBickStrategy implements IStrategy { public function OnTheWay() { output( ' '); } } class CarStrategy implements IStrategy { public function OnTheWay() { output( ' '); } } // Context class Context { public function find($strategy) { $strategy->OnTheWay(); } } class Client { public static function test(){ $travel = new Context(); $travel->find(new WalkStrategy()); $travel->find(new RideBickStrategy()); $travel->find(new CarStrategy()); } } Client::test();

  
  • 이미 알 고 있 는 모드
  • 1. 비망록 모드 (Memento):
          대상 을 한 시각 에 저장 하 는 상태 입 니 다.친, '선생님 오 셨 어 요. 불 러 주세요' 짝 꿍 기억 나 세 요?
          장점: 사용자 에 게 상 태 를 회복 할 수 있 는 메커니즘 을 제공 합 니 다.
          단점: 자원 소모.
          응용 장면: 저장 할 데이터 에 사용
    코드 구현:
    <?php
    
    
    
    /**
    
     *           
    
     *
    
     *       Memento
    
     *
    
     * @author            
    
     * @see http://www.ucai.cn
    
     */
    
    
    
    function output($string) {
    
        echo    $string . "
    "; } class Originator { // (Originator) private $_state; public function __construct() { $this->_state = ''; } public function createMemento() { // return new Memento($this->_state); } public function restoreMemento(Memento $memento) { // $this->_state = $memento->getState(); } public function setState($state) { $this->_state = $state; } public function getState() { return $this->_state; } public function showState() { output($this->_state); } } class Memento { // (Memento) private $_state; public function __construct($state) { $this->setState($state); } public function getState() { return $this->_state; } public function setState($state) { $this->_state = $state;} } class Caretaker { // (Caretaker) private $_memento; public function getMemento() { return $this->_memento; } public function setMemento(Memento $memento) { $this->_memento = $memento; } } class Client { public static function test(){ $org = new Originator(); $org->setState('open'); $org->showState(); /* */ $memento = $org->createMemento(); /* Caretaker */ $caretaker = new Caretaker(); $caretaker->setMemento($memento); /* */ $org->setState('close'); $org->showState(); /* */ $org->restoreMemento($caretaker->getMemento()); $org->showState(); } } Client::test(); return; try { $db->beginTransaction(); $succ = $db->exec($sql_1); if (!$succ) { throw new Exception('SQL 1 update failed'); } $succ = $db->exec($sql_2); if (!$succ) { throw new Exception('SQL 2 update failed'); } $succ = $db->exec($sql_3); if (!$succ) { throw new Exception('SQL 3 update failed'); } $db->commit(); } catch (Exception $exp) { $db->rollBack(); }

      
  • 깊이 모드
  • 1. 해석 기 모드 (Interpreter):
           언어의 문법 을 정의 하고 이 언어의 문장 을 해석 하 는 해석 기 를 만 듭 니 다.사전 을 써 본 모든 동 화 는 다 안다.
           장점: 확장 성 이 좋 고 유연성 이 크다.
           단점: 복잡 한 문법 을 지 키 기 어 려 울 수 있 습 니 다.
           응용 장면: 쌍 을 이 루 거나 한 쌍 이 많은 수요 에 사용 합 니 다.
    2. 방문 자 모드 (Visitor):
          특정한 데이터 구조 에서 각 요소 에 작용 하 는 조작 을 밀봉 하면 데이터 구 조 를 바 꾸 지 않 는 전제 에서 이러한 요소 에 작용 하 는 새로운 조작 을 정의 할 수 있다.예 를 들 어 은행 번호 매기 기.
          장점: 관련 사물 을 방문 자 대상 에 집중 시킨다.
          단점: 새로운 데이터 구 조 를 늘 리 는 것 은 어렵다.
          응용 장면: 줄 서기, 번호 매기 기.
    3. 총화
          본 고 는 행위 형 모델 을 소개 했다. 행위 모델 은 알고리즘 과 대상 직책 간 의 분배 와 관련 되 고 행위 유형 모델 은 계승 체 제 를 이용 하여 유형 간 에 분 파 된 행 위 를 하 며 Template Method 와 Interpreter 는 유형 행위 모델 이다.행위 대상 모델 사용 대상 복합 이 아니 라 계승, 일부 행위
    대상 모드 는 서로 대등한 대상 이 어떻게 서로 협력 하여 그 어떠한 대상 도 단독으로 완성 할 수 없 는 임 무 를 완성 하 는 지 설명 합 니 다. 예 를 들 어 Mediator 가 대상 간 에 mediator 대상 을 도입 하여 소나무 결합 에 필요 한 간접 성 을 제공 합 니 다.Chain of Responsibility 는 더욱 느슨 한 결합 을 제공 합 니 다.
    이 는 후보 대상 체인 을 통 해 한 대상 에 게 암시 적 으로 요청 을 보 내 고 실행 시간 에 어떤 후보자 가 체인 에 참여 하 는 지 결정 할 수 있 습 니 다.Observer 는 대상 간 의 의존 관 계 를 정의 하고 유지 합 니 다.다른 행위 대상 모드 는 항상 행 위 를 한 대상 에 밀봉 하고 요청 을 할당 합 니 다.
    이 는 Strategy 모드 에서 알고리즘 을 대상 에 밀봉 하여 한 대상 이 사용 하 는 알고리즘 을 변경 하고 지정 할 수 있 습 니 다.command 모드 는 요청 을 대상 에 밀봉 합 니 다. 그러면 매개 변수 로 전달 할 수 있 고 역사 목록 에 저장 하거나 다른 방식 으로 사용 할 수 있 습 니 다.State
    패턴 은 대상 의 상 태 를 밀봉 하여 이 대상 의 상태 대상 이 변화 할 때 이 대상 은 행동 을 바 꿀 수 있 습 니 다.Visitor 모드 는 여러 종류 사이 에 분포 하 는 행 위 를 봉인 합 니 다.Iterator 모드 는 집합 대상 을 방문 하고 옮 겨 다 니 는 방식 을 추상 화 했다.

    좋은 웹페이지 즐겨찾기