상태 모드--당신이 편안하면 맑은 날

5853 단어
현실에서 대상의 표현은 종종 고정된 것이 아니라 시간이나 환경에 따라 변화하는 것이다. 크면 사람은 시간에 따라 늙고 작으면 날씨에 따라 희로애락한다.이때 대상의 상태는 어떤 요소에 따라 바뀌고 행위도 따라서 바뀐다. 마치 비오는 밤(요소)은 사람을 슬프게 하기 쉽고 취하게 하기 쉽다.
한 대상의 행위가 그 상태에 달려 있고 운행할 때 시간 상태에 따라 그 행위를 바꿔야 할 때 우리는 상태 모델로 실현하여 대량의 switch 지점 판단을 없앨 수 있다.
우선, 이 행위를 정의하는 것은 상태의 대상에 달려 있다. 여기는 날씨를 대상으로 날씨가 당신이 좋아하는 그녀의 상태의 영향을 받아 변화하는 것을 보여준다.
class weather{
    //  
    public $you;
    // 
    public $state;
    // 
    public function __construct($e,$s)
    {
        $this->you=$e;
        $this->state=$s;
    }
    // 
    public function setState(state $s){
        $this->state=$s;
    }
    // 
    public function setEnvironment($t){
        $this->you=$t;
    }
    // 
    public function motion(){
        $this->state->yourstate($this);
    }
}
 , :
     abstract class state{
       abstract function yourState(weather $weacher);
     }

그런 다음 특정 상태를 정의합니다.
class state1 extends state {
    function yourState(weather $weather)
    {
    // 
       if(' ' == $weather->you){
           echo " ";
    }else{
    // flower , motion 
           $weather->setState(new state2());
           $weather->motion();
    }
    }
}
class state2 extends state {
    function yourState(weather $weather)
    {
        if(' '==$weather->you){
            echo " 
"
; }else{ $weather->setState(new state1()); $weather->motion(); } } }

지금까지 우리가 정의한 것을 살펴보자. weather: 행위는 상태에 달려 있는 클래스state: 추상적인 상태 클래스state1,state2: 구체적인 클래스가 완성되면 다음 클라이언트에서 상태 모드를 사용할 수 있다.
// ' ' ' ' , state1
$obj=new weather(' ',new state1());
// , 
$obj->motion();
// 
$obj->you=' ';
// , , , 
$obj->motion();

총괄적으로 보면 우리가 새로운 상태를 추가해야 할 때 새로운 구체적인 상태류만 정의하면 된다는 것을 알 수 있다.swtich 지점을 이용하여 환경 요소에 대해 판단하고 서로 다른 행위를 선택하는 것에 비해 상태 모델은 개방 폐쇄 원칙을 잘 구현했다.

좋은 웹페이지 즐겨찾기