<?php // require the files needed for this test require_once ("../DCIObject.php"); require_once ("../DCIException.php"); require_once ("../Context.php"); interface rMoneySource { function Withdraw($amount); } interface rMoneySink { function Deposit($amount); } class rMoneySourceActions { static function TransferFunds(rMoneySource $self, rMoneySink $dest, $amount) { if ($self->Withdraw($amount)) $dest->Deposit($amount); } } /** * A base Account object. It's a dumb model, capable only * of increasing and decreasing its balance. We can use * roles to make different Account objects interact with each * other. * * Contexts are "use cases". They call role methods to implement interactivity * Role methods are "algorithms". They call various object methods to perform a task */ class Account extends DCIObject implements rMoneySource, rMoneySink { protected $balance; function __construct($initial_balance) { parent::__construct(); $this->balance = $initial_balance; } function Withdraw($amount) { if ($amount <= $this->balance) { $this->balance -= $amount; return $amount; } else throw new DCIException("Insufficient Funds","Tried to withdraw $amount<br />{$this->balance} available."); } function Deposit($amount) { $this->balance += $amount; } function GetBalance() { return $this->balance; } } class FeeAccount extends Account { function Deposit($amount) { $this->balance += ($amount * .9); } } /** * The example code-- implemented as a context */ class TransferCtx extends Context { function Execute(rMoneySource $source, rMoneySink $sink, $amount) { $source->TransferFunds($sink,$amount); } } /** * Run the context and display the change in values */ $checking = new Account(1000); $savings = new FeeAccount(500); echo "<h3>Initialization Test:</h3>"; echo "Checking Account: $" . $checking->GetBalance() . "<br />"; echo "Savings Account: $" . $savings->GetBalance() . "<br /><br />"; $tm_ctx = new TransferCtx(); $tm_ctx->Execute($checking, $savings, 500); echo "<h3>Transaction Test:</h3>"; echo "Checking Account: $" . $checking->GetBalance() . "<br />"; echo "Savings Account: $" . $savings->GetBalance() . "<br /><br />"; echo "<h3>Insufficient Funds Exception Test</h3>"; echo "Insufficient Funds Test:<br />"; $tm_ctx->Execute($checking, $savings, 1000); ?>
|