問題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>"; } } } ?>