DEV Community

Cover image for Examples of Strategy Patterns in PHP
Ahmed Raza Idrisi
Ahmed Raza Idrisi

Posted on

Examples of Strategy Patterns in PHP

  • Payment Processing

Different customers may want to pay differently:

interface PaymentStrategy {
    public function pay(int $amount): string;
}

class CreditCardPayment implements PaymentStrategy {
    public function pay(int $amount): string {
        return "Paid $amount using Credit Card";
    }
}

class PayPalPayment implements PaymentStrategy {
    public function pay(int $amount): string {
        return "Paid $amount using PayPal";
    }
}

class CryptoPayment implements PaymentStrategy {
    public function pay(int $amount): string {
        return "Paid $amount using Crypto";
    }
}

class PaymentProcessor {
    private PaymentStrategy $strategy;

    public function __construct(PaymentStrategy $strategy) {
        $this->strategy = $strategy;
    }

    public function process(int $amount): string {
        return $this->strategy->pay($amount);
    }
}

// βœ… Usage
echo (new PaymentProcessor(new PayPalPayment()))->process(100);
echo (new PaymentProcessor(new CryptoPayment()))->process(250);

Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ Use case: E-commerce websites (Amazon, Flipkart, Shopify) where customers choose different payment methods.

  • Sorting Algorithms

You can swap between different sorting strategies depending on the situation (performance, dataset size, etc.).

interface SortStrategy {
    public function sort(array $data): array;
}

class BubbleSort implements SortStrategy {
    public function sort(array $data): array {
        // fake bubble sort
        sort($data);
        return $data;
    }
}

class QuickSort implements SortStrategy {
    public function sort(array $data): array {
        // fake quick sort
        rsort($data);
        return $data;
    }
}

class SortContext {
    private SortStrategy $strategy;

    public function __construct(SortStrategy $strategy) {
        $this->strategy = $strategy;
    }

    public function execute(array $data): array {
        return $this->strategy->sort($data);
    }
}

// βœ… Usage
$data = [5, 1, 4, 2];
echo implode(", ", (new SortContext(new BubbleSort()))->execute($data));

Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ Use case: Data processing tools, libraries, or apps needing pluggable sorting.

  • Compression (Zip, Rar, Tar)

You may need different compression formats.

interface CompressionStrategy {
    public function compress(string $file): string;
}

class ZipCompression implements CompressionStrategy {
    public function compress(string $file): string {
        return "Compressing $file using ZIP";
    }
}

class RarCompression implements CompressionStrategy {
    public function compress(string $file): string {
        return "Compressing $file using RAR";
    }
}

class TarCompression implements CompressionStrategy {
    public function compress(string $file): string {
        return "Compressing $file using TAR";
    }
}

class Compressor {
    private CompressionStrategy $strategy;

    public function __construct(CompressionStrategy $strategy) {
        $this->strategy = $strategy;
    }

    public function compress(string $file): string {
        return $this->strategy->compress($file);
    }
}

// βœ… Usage
echo (new Compressor(new RarCompression()))->compress("backup.sql");

Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ Use case: Backup software, file sharing platforms.

  • Travel/Navigation (Google Maps Example)

Different travel modes: car, bike, walking, train.

interface RouteStrategy {
    public function buildRoute(string $from, string $to): string;
}

class CarRoute implements RouteStrategy {
    public function buildRoute(string $from, string $to): string {
        return "Driving from $from to $to";
    }
}

class BikeRoute implements RouteStrategy {
    public function buildRoute(string $from, string $to): string {
        return "Cycling from $from to $to";
    }
}

class WalkRoute implements RouteStrategy {
    public function buildRoute(string $from, string $to): string {
        return "Walking from $from to $to";
    }
}

class Navigator {
    private RouteStrategy $strategy;

    public function __construct(RouteStrategy $strategy) {
        $this->strategy = $strategy;
    }

    public function navigate(string $from, string $to): string {
        return $this->strategy->buildRoute($from, $to);
    }
}

// βœ… Usage
echo (new Navigator(new BikeRoute()))->navigate("Home", "Park");

Enter fullscreen mode Exit fullscreen mode

πŸ‘‰ Use case: Google Maps, Uber, delivery route planners.

Top comments (0)