PHP Design Patterns .

PHP Design Patterns State

About the State

In the State Pattern a class will change it's behavior when circumstances change.

In this example, the BookContext class holds an implementation of the BookTitleStateInterface, starting with BookTitleStateStars. BookTitleStateStars and BookTitleStateExclaim will then replace each other in BookContext depending on how many times they are called.

BookContext.php

//copyright Lawrence Truett and FluffyCat.com 2006, all rights reserved
  
  include_once('Book.php');
  include_once('BookTitleStateStars.php');

class BookContext { private $book = NULL; private $bookTitleState = NULL; //bookList is not instantiated at construct time public function __construct($book_in) { $this->book = $book_in; $this->setTitleState(new BookTitleStateStars()); }

public function getBookTitle() { return $this->bookTitleState->showTitle($this); }

public function getBook() { return $this->book; }

public function setTitleState($titleState_in) { $this->bookTitleState = $titleState_in; }

}
To download source right-click here and "Save As...".


BookTitleStateInterface.php

//copyright Lawrence Truett and FluffyCat.com 2006, all rights reserved

interface BookTitleStateInterface { public function showTitle($context_in);

}
To download source right-click here and "Save As...".

BookTitleStateExclaim.php

//copyright Lawrence Truett and FluffyCat.com 2006, all rights reserved
  
  include_once('Book.php');
  include_once('BookTitleStateInterface.php');
  include_once('BookTitleStateStars.php');
  
  class BookTitleStateExclaim implements BookTitleStateInterface {
      
    private $titleCount = 0; 
    
    public function showTitle($context_in) {
      $title = $context_in->getBook()->getTitle();
      $this->titleCount++;
      $context_in->setTitleState(new BookTitleStateStars());
      return Str_replace(' ','!',$title);
    }
  }
To download source right-click here and "Save As...".

BookTitleStateStars.php

//copyright Lawrence Truett and FluffyCat.com 2006, all rights reserved
  
  include_once('Book.php');
  include_once('BookTitleStateInterface.php');
  include_once('BookTitleStateExclaim.php');
  
  class BookTitleStateStars implements BookTitleStateInterface {
      
    private $titleCount = 0; 
    
    public function showTitle($context_in) {
      $title = $context_in->getBook()->getTitle();
      $this->titleCount++;
      if (1 < $this->titleCount) {
        $context_in->setTitleState(new BookTitleStateExclaim); 
      }
      return Str_replace(' ','*',$title);
    }
  }
To download source right-click here and "Save As...".

Book.php

//copyright Lawrence Truett and FluffyCat.com 2005, all rights reserved
  
  class Book {

private $author; private $title;

function __construct($title_in, $author_in) { $this->author = $author_in; $this->title = $title_in; }

function getAuthor() {return $this->author;}

function getTitle() {return $this->title;}

function getAuthorAndTitle() { return $this->getTitle() . ' by ' . $this->getAuthor(); }

}
To download source right-click here and "Save As...".


testState.php

//copyright Lawrence Truett and FluffyCat.com 2006, all rights reserved

include_once('Book.php'); include_once('bookContext.php');

define('BR', '<'.'BR'.'>');

echo 'BEGIN TESTING STATE PATTERN'.BR; echo BR; $book = new Book('PHP for Cats','Larry Truett');; $context = new bookContext($book); echo 'test 1 - show name'.BR; echo $context->getBookTitle(); echo BR.BR;

echo 'test 2 - show name'.BR; echo $context->getBookTitle(); echo BR.BR; echo 'test 3 - show name'.BR; echo $context->getBookTitle(); echo BR.BR; echo 'test 4 - show name'.BR; echo $context->getBookTitle(); echo BR.BR;

echo 'END TESTING STATE PATTERN'.BR;
To download source right-click here and "Save As...".

output of testState.php

BEGIN TESTING STATE PATTERN

test 1 - show name PHP*for*Cats

test 2 - show name PHP*for*Cats

test 3 - show name PHP!for!Cats

test 4 - show name PHP*for*Cats

END TESTING STATE PATTERN

References


Design Patterns
Design Patterns by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides

PHP 5
The Official PHP web site
Core PHP Programming, 3rd Edition by Leon Atkinson and Zeev Suraski
Comments
Sign in to be the first to comment on PHP Design Patterns State.