Archive for the ‘Uncategorized’ Category

game theory pattern code example

Tuesday, February 17th, 2009

so i finally took the time to write some code to better articulate my thoughts on ‘game theory pattern’.

/*
* Abstract Unifier class to select objects from different sources.
*/
 
abstract class childObjectUnifier
{
    protected $currentObjectLocation;    
 
    public function __construct()
    {
        $this->currentObjectLocation = get_class($this);
    }
 
    public function getData()
    {
        switch ($this->currentObjectLocation)
        {
             case 'currentServerLoginObject':
                    return $this->currentServerLoginFunction();
                    break;
 
             case 'remoteServerLoginObject':
                    return $this->remoteServerLoginFunction();
                    break;
 
             default:
                    die('Current user load not available');
        }
    }
}
 
/*
* Login Object which exists on the current server.
* This object could still be hit on the current server if the current user load is not high.
* Better utilizes the current server.
*/
 
class currentServerLoginObject extends childObjectUnifier
{
    public function currentServerLoginFunction()
    {
         return 'Some function on the current server';
    }
}
 
/*
* This login object could exist remotely, for e.g. a restfull/soap/xml-rpc service
* which could be hit if the current server load is climbing.
* Could possibly use a dedicated 'login' server if user load is exceedingly high on current machine.
*/
 
class remoteServerLoginObject extends childObjectUnifier
{
    public function remoteServerLoginFunction()
    {
        return 'Some function on the remote server';
    }
}
 
/*
* The game theory pattern which decides which objects to instantiate based on logical
* decisions made by solid data.
* In this example the current user load.
*/
 
class GameTheoryPattern
{
    public $currentObject;
 
    function __construct($iCurrentUserLoad)
    {
        $this->currentObject = $this->baseObjectUponStrategicData($iCurrentUserLoad);
    }
 
    private function baseObjectUponStrategicData($iCurrentUserLoad)
    {
         switch ($iCurrentUserLoad)
         {
             case $iCurrentUserLoad < 1000:
                    return new currentServerLoginObject();
                    break;
 
             case $iCurrentUserLoad >= 1000 :
                    return new remoteServerLoginObject();
                    break;
 
             default:
                    die('Current user load not available');
        }
    }
}
 
//GetCurrentUserLoad
$iCurrentUserLoad = 1000;
 
//Create Login Object based on the Game Theory Pattern
$oLogin = new GameTheoryPattern($iCurrentUserLoad);
 
//Call an function from the unifier class
echo $oLogin->currentObject->getData();
 
?>

It should be pretty self explanatory - due to the high level comments :-)

feel free to add suggestions or comments - since i’m pretty sure there could be a better way, but for now, just to convey the message it should be sufficient.