strategy pattern


ارسال در تاریخ ۰۳ مهر,۱۳۹۶



ممکن است که برای انجام یک کار الگوریتم های مختلفی داشته باشیم. فرضا مرتب سازی آرایه را می توان توسط چندین الگوریتم انجام داد. این الگوی طراحی این امکان را می‌دهد که یک عملیات را با الگوریتم‌های مختلف پیاده‌سازی کنیم و در هر زمان که خواستیم از هر کدام از این الگوریتم ها استفاده کنیم.

مثال از مرتب سازی آرایه با الگوریتم های مختلف:

interface SortStrategy
{
    public function sort($array, $reverse);
}
  
class BubbleSort implements SortStrategy
{
    public function sort($array, $reverse)
    {
        // TODO bubble-sort implementation
    }
}
  
class InsertionSort implements SortStrategy
{
    public function sort($array, $reverse)
    {
        // TODO insertion-sort implementation
    }
}
  
class QuickSort implements SortStrategy
{
    public function sort($array, $reverse)
    {
        // TODO quick-sort implementation
    }
}

که به صورت زیر می توان از این کد استفاده کرد:

$array1 = ["Melon","Peach","Cherry"];
$array2 = ["Kiwifruit","Lime","Apple"];
// fill arrays
$sortStrategy = new BubbleSort();
$sortStrategy.sort($array1,false);//sorts array1 with bubble sort algorithm
$sortStrategy = new QuickSort();
$sortStrategy.sort(array2,false);//sorts array2 with quick sort algorithm

توسط الگوی strategy توسعه دهنده می تواند به سادگی و بدون دستکاری کد اصلی یک الگوریتم دیگر تعریف کرده و استفاده کند.

مثال دیگر استفاده از الگوی طراحی strategy :

interface OutputInterface
{
    public function load();
}

class SerializedArrayOutput implements OutputInterface
{
    public function load()
    {
        return serialize($arrayOfData);
    }
}

class JsonStringOutput implements OutputInterface
{
    public function load()
    {
        return json_encode($arrayOfData);
    }
}

class ArrayOutput implements OutputInterface
{
    public function load()
    {
        return $arrayOfData;
    }
}

توسط encapsulate کردن الگوریتم های بالا، کد، زیبا و شفاف شده است و توسعه دهنده ها می توانند یک نوع خروجی جدید بدون دستکاری کد کلاینت ایجاد کنند. همانطور که مشاهده می شود هر الگوریتم رابط OutputInterface را پیاده سازی کرده است، این خود دو هدف دارد، در درجه اول اینکه هر الگوریتم را مطیع کنیم تا متدهای رابط را پیاده سازی کند و دوم اینکه توسط پیاده سازی رابط می توانیم از قابلیت Type Hinting استفاده کنیم.

بصورت زیر می توان از کد بالا استفاده کرد:

class SomeClient
{
    private $output;

    public function setOutput(OutputInterface $outputType)
    {
        $this->output = $outputType;
    }

    public function loadOutput($arrayOfData)
    {
        return $this->output->load($arrayOfData);
    }
}


$client = new SomeClient();


$arrayOfData = ["php","laravel","rails"];

// Want an array?
$client->setOutput(new ArrayOutput());
print_r($data = $client->loadOutput($arrayOfData));

// Want some JSON?
$client->setOutput(new JsonStringOutput());
print_r($data = $client->loadOutput($arrayOfData));

// Want some SerializedArray?
$client->setOutput(new SerializedArrayOutput());
print_r($data = $client->loadOutput($arrayOfData));

 


برای ارسال نظر لطفا وارد شوید.