php設計モード-ポリシーモード


このモードでは、アルゴリズムは複雑なクラスから抽出されるため、容易に置き換えることができる.たとえば、検索エンジンでページを並べ替える方法を変更する場合は、ポリシー・モードが良い選択です.検索エンジンのいくつかの部分を考えてみましょう.一部はページを巡り、一部はページごとに並べ、もう一部は並べ替えの結果に基づいて並べ替えられます.複雑な例では、これらの部分は同じクラスにあります.ポリシー・モードを使用すると、検索エンジンの残りのコードに影響を与えることなく、別のクラスに配置セクションを挿入して、ページの配置方法を変更できます.
簡単な例として、プラグアンドプレイのポリシーのセットに基づいてユーザーのセットを検索する方法を提供するユーザーリストクラスが表示されます.
Strategy.php
<?php
interface IStrategy
{
  function filter( $record );
}

class FindAfterStrategy implements IStrategy
{
  private $_name;

  public function __construct( $name )
  {
    $this->_name = $name;
  }

  public function filter( $record )
  {
    return strcmp( $this->_name, $record ) <= 0;
  }
}

class RandomStrategy implements IStrategy
{
  public function filter( $record )
  {
    return rand( 0, 1 ) >= 0.5;
  }
}

class UserList
{
  private $_list = array();

  public function __construct( $names )
  {
    if ( $names != null )
    {
      foreach( $names as $name )
      {
        $this->_list []= $name;
      }
    }
  }

  public function add( $name )
  {
    $this->_list []= $name;
  }

  public function find( $filter )
  {
    $recs = array();
    foreach( $this->_list as $user )
    {
      if ( $filter->filter( $user ) )
        $recs []= $user;
    }
    return $recs;
  }
}

$ul = new UserList( array( "Andy", "Jack", "Lori", "Megan" ) );
$f1 = $ul->find( new FindAfterStrategy( "J" ) );
print_r( $f1 );

$f2 = $ul->find( new RandomStrategy() );
print_r( $f2 );
?>