執行及描述任務-------策略模式

問題php

若是類的相關操做須要根據環境變化而變化,那麼可能會須要將類分解爲子類,可是若是經過繼承數建立多個子類的話就會產生一些問題,致使繼承樹體系中的每一個分支中相關操做重複。當類必須支持同一個接口的多種實現時,最好的辦法就是提取這些實現,並將他們防止在本身的類型中,而不是經過繼承原有的類去支持這些實現。this

umlspa

代碼實現code

<?php
//strategy.php 策略模式
abstract class Question{
    protected $prompt;
    protected $marker;
    function __construct($prompt,Marker $marker)
    {
        $this->prompt = $prompt;
        $this->marker = $marker;
    }

    function mark($response){
        return $this->marker->mark($response);
    }
}

//文本問題
class TextQuestion extends Question{

}

//語音問題
class AVquestion extends Question{

}

abstract class Marker{
    protected $test;

    abstract function mark($response);

    function __construct($test){
        $this->test = $test;
    }
}

class MarkLogicMarker extends Marker{
    function mark($response){

    }
}

class MatchMarker extends Marker{
    function mark($response){
        return ($this->test==$response);
    }
}

class RegexpMarker extends Marker{
    function mark($response){
        return (preg_match($this->test,$response));
    }
}






//client兩個策略對象
$markers = array(
    new RegexpMarker('/f.ve/'),
    new MatchMarker('five')
);

foreach ($markers as $marker) {
    echo get_class($marker)."<br>";
    $questio = new TextQuestion("how many beans make five",$marker);
    foreach (array('five','four') as $response) {
        echo "\tresponse: $response: ";
        if($questio->mark($response)){
            echo "well done<br>";
        }else{
            echo "never mind<br>";
        }
    }
}
?>
相關文章
相關標籤/搜索