Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 15 additions & 7 deletions PHP/Patterns/index.php
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
<?php


use DesignPatterns\Behavioral\Observer\Exercise\Models\Blog;
use DesignPatterns\Behavioral\Observer\Exercise\Models\User;
use DesignPatterns\Behavioral\Observer\Exercise\Enums\EventType;
use DesignPatterns\Behavioral\Observer\Exercise\Models\NewsLetter;
use DesignPatterns\Behavioral\Observer\Exercise\NewsLetterNotification;


require_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';

Expand All @@ -26,8 +26,16 @@

// newsletter example
// Get the current date and time
$publishedAt = new DateTime();
$newsletter = new NewsLetterNotification();
$newsletter->subscribe(EventType::BLOG,new User('Ahmed'));
$newsletter->addBlog(new Blog('test blog tilte','test blog content',$publishedAt));
$newsletter->addNewsLetter(new NewsLetter('test newsletter tilte','test newsletter content',$publishedAt));
//$publishedAt = new DateTime();
//$newsletter = new NewsLetterNotification();
//$newsletter->subscribe(EventType::BLOG,new User('Ahmed'));
//$newsletter->addBlog(new Blog('test blog tilte','test blog content',$publishedAt));
//$newsletter->addNewsLetter(new NewsLetter('test newsletter tilte','test newsletter content',$publishedAt));


// factory method example
//$processor = new DesignPatterns\Creational\FactoryMethod\PaymentProcessor();
//echo $processor->processPayment('VISA');
//echo PHP_EOL;
//echo $processor->processPayment('MASTER_CARD');

67 changes: 67 additions & 0 deletions PHP/Patterns/src/Creational/FactoryMethod/AmericanExpress.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php

namespace DesignPatterns\Creational\FactoryMethod;

class AmericanExpress implements PaymentMethod
{
private string $cardNumber;
private string $cardHolder;
private string $expiryDate;
private string $cvv;

public function authorize(): string
{
return "Authorizing American Express card...\n";
}

public function moneyTransfer(): string
{
return 'Transferring money using American Express card...\n';
}

public function calculatePaymentFees(): float
{
return 0.035; // 3.5% fee
}

public function getCardNumber(): string
{
return $this->cardNumber;
}

public function setCardNumber(string $cardNumber): void
{
$this->cardNumber = $cardNumber;
}

public function getCardHolder(): string
{
return $this->cardHolder;
}

public function setCardHolder(string $cardHolder): void
{
$this->cardHolder = $cardHolder;
}

public function getExpiryDate(): string
{
return $this->expiryDate;
}

public function setExpiryDate(string $expiryDate): void
{
$this->expiryDate = $expiryDate;
}

public function getCvv(): string
{
return $this->cvv;
}

public function setCvv(string $cvv): void
{
$this->cvv = $cvv;
}
}

67 changes: 67 additions & 0 deletions PHP/Patterns/src/Creational/FactoryMethod/MasterCard.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?php

namespace DesignPatterns\Creational\FactoryMethod;

class MasterCard implements PaymentMethod
{
private string $cardNumber;
private string $cardHolder;
private string $expiryDate;
private string $cvv;

public function authorize(): string
{
return "Authorizing MasterCard...\n";
}

public function moneyTransfer(): string
{
return "Transferring money using MasterCard...\n";
}

public function calculatePaymentFees(): float
{
return 0.03; // 3% fee
}

public function getCardNumber(): string
{
return $this->cardNumber;
}

public function setCardNumber(string $cardNumber): void
{
$this->cardNumber = $cardNumber;
}

public function getCardHolder(): string
{
return $this->cardHolder;
}

public function setCardHolder(string $cardHolder): void
{
$this->cardHolder = $cardHolder;
}

public function getExpiryDate(): string
{
return $this->expiryDate;
}

public function setExpiryDate(string $expiryDate): void
{
$this->expiryDate = $expiryDate;
}

public function getCvv(): string
{
return $this->cvv;
}

public function setCvv(string $cvv): void
{
$this->cvv = $cvv;
}
}

18 changes: 18 additions & 0 deletions PHP/Patterns/src/Creational/FactoryMethod/PaymentMethod.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace DesignPatterns\Creational\FactoryMethod;

interface PaymentMethod
{
public function authorize(): mixed;
public function moneyTransfer(): mixed;
public function calculatePaymentFees(): float;
public function getCardNumber(): string;
public function setCardNumber(string $cardNumber): void;
public function getCardHolder(): string;
public function setCardHolder(string $cardHolder): void;
public function getExpiryDate(): string;
public function setExpiryDate(string $expiryDate): void;
public function getCvv(): string;
public function setCvv(string $cvv): void;
}
17 changes: 17 additions & 0 deletions PHP/Patterns/src/Creational/FactoryMethod/PaymentMethodFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace DesignPatterns\Creational\FactoryMethod;

class PaymentMethodFactory
{
public function createPaymentMethod(string $cardType): PaymentMethod
{
return match (strtoupper($cardType)) {
'VISA' => new Visa(),
'MASTER_CARD' => new MasterCard(),
'AMERICAN_EXPRESS' => new AmericanExpress(),
default => throw new \InvalidArgumentException("Unknown card type: {$cardType}")
};
}
}

22 changes: 22 additions & 0 deletions PHP/Patterns/src/Creational/FactoryMethod/PaymentProcessor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

namespace DesignPatterns\Creational\FactoryMethod;

use function var_dump;

class PaymentProcessor
{
private PaymentMethodFactory $paymentMethodFactory;

public function __construct()
{
$this->paymentMethodFactory = new PaymentMethodFactory();
}

public function processPayment(string $cardType): mixed
{
$paymentMethod = $this->paymentMethodFactory->createPaymentMethod($cardType);
return ' => ' . $paymentMethod->authorize() . ' => ' . $paymentMethod->moneyTransfer();
}
}

66 changes: 66 additions & 0 deletions PHP/Patterns/src/Creational/FactoryMethod/Visa.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?php

namespace DesignPatterns\Creational\FactoryMethod;

class Visa implements PaymentMethod
{
private string $cardNumber;
private string $cardHolder;
private string $expiryDate;
private string $cvv;

public function authorize(): string
{
return "Authorizing Visa card...\n";
}

public function moneyTransfer(): string
{
return "Transferring money using Visa card...\n";
}

public function calculatePaymentFees(): float
{
return 0.025; // 2.5% fee
}

public function getCardNumber(): string
{
return $this->cardNumber;
}

public function setCardNumber(string $cardNumber): void
{
$this->cardNumber = $cardNumber;
}

public function getCardHolder(): string
{
return $this->cardHolder;
}

public function setCardHolder(string $cardHolder): void
{
$this->cardHolder = $cardHolder;
}

public function getExpiryDate(): string
{
return $this->expiryDate;
}

public function setExpiryDate(string $expiryDate): void
{
$this->expiryDate = $expiryDate;
}

public function getCvv(): string
{
return $this->cvv;
}

public function setCvv(string $cvv): void
{
$this->cvv = $cvv;
}
}