PHP設計モード——戦略モード

2464 ワード

一連のアルゴリズムを定義し、各アルゴリズムをカプセル化し、交換可能にします.ポリシーは、アルゴリズムを使用するクライアントとは独立に変化させる.
通勤は私たちの日常生活の一部です.毎日、私たちが家を出て出勤するとき、私たちは交通手段を選択しなければなりません.通勤者として、タクシー、バス、汽車がたくさんあります.これは実際に私たちの気持ちと私たちの状況にかかっています.出かける時間が遅くて急いでいるように、タクシーに乗るかもしれません.別の日に、席があるかどうかで十分な時間があれば、バスに乗るのはいい選択です.私たちが時間通りにどこかに到着し、交通渋滞に巻き込まれないようにしたい日には、汽車に乗ります.
これはポリシーモードの完璧な例です.
バス、汽車、タクシーは交通手段ですが、もちろん多くの面で違います.それらはコスト的に互いに異なり、異なるルートで目的地に連れて行きます.旅行時間の長さは異なるが、目的地に着く方法の一つだから、同じです.彼らはみな輸送の範疇に属している.
まず、輸送(Transportation)に関するインタフェースを作成します.
interface  Transportation
{
     function transport(Passenger $passenger);
}
Transportationインタフェースを実装するBusクラスを作成します.
class Bus implements Transportation
{
     public function transport(Passenger $passenger)
     {
         echo '    A       ';
     }
}
Transportationインタフェースを実装するTrainクラスを作成します.
class Train implements Transportation
{
    public function transport(Passenger $passenger)
    {
        echo '    B       ';
    }
}
Transportationインタフェースを実装するTaxiクラスを作成します.
class Taxi implements Transportation
{
    public function transport(Passenger $passenger)
    {
        echo '    C       ';
    }
}

最後に、乗客(Passenger)クラスを作成して、私たちを代表する必要があります.
class Passenger
{
    private $_transportation = null;
 
    public function goToWork()
    {
        $this->_transportation->transport($this);
    }
 
    public function chooseTransport(Transportation $transportation)
    {
        $this->_transportation = $transportation;
    }
}

次に、乗客がコンテキストで異なる交通手段をどのように使用するかを見てみましょう.
$john   = new Passenger();
$bus    = new Bus();
$train  = new Train();
$taxi   = new Taxi();
//      
$john->chooseTransport($bus);
$john->goToWork();
//     
$john->chooseTransport($train);
$john->goToWork();
//     
$john->chooseTransport($taxi);
$john->goToWork();

バス(Bus)、列車(Train)、タクシー(Taxi)のクラスは、いずれも輸送(Passenger)インタフェースを実現するため、乗客(Transportation)のクラスとは異なる.
我々の例では、ポリシー・モードを適用することによって、アルゴリズム(バス、列車、タクシー)のカテゴリ(輸送カテゴリ)を定義し、各アルゴリズム(Passenger乗客クラスは輸送(Transportation)インタフェースのみを知り、それらを交換可能にする(それらは汎用インタフェースを実装している).ポリシーは、アルゴリズムを使用するクライアント(Passengerクラス)とは独立に変化させる.