Cours Design Pattern
Cours Design Pattern
Cours Design Pattern
(PHP)
Achref El Mouelhi
1 Introduction
5 Liens utiles
Définition
Chaque patron décrit un problème qui se manifeste constamment
dans notre environnement, et donc décrit le cœur de la solution à ce
problème, d’une façon telle que l’on puisse réutiliser cette solution des
millions de fois, sans jamais le faire deux fois de la même manière.
Définition
Chaque patron décrit un problème qui se manifeste constamment
dans notre environnement, et donc décrit le cœur de la solution à ce
problème, d’une façon telle que l’on puisse réutiliser cette solution des
millions de fois, sans jamais le faire deux fois de la même manière.
Catégories
C’est quoi ?
C’est quoi ?
Remarques
les design patterns ne sont pas relatifs à un langage de
programmation
ils sont très adaptés aux langages de programmation
orientés-objets
ils offrent des solutions à des problématiques récurrents
rencontrés par les développeurs
certains motifs ont été pris en charge par des langages de
programmation (Java et Observable...)
Sémantique
Problématique et solution
Une instance qu’on ne peut instancier qu’une seule fois
l’unicité de l’instance est complètement contrôlée par la classe
elle-même
Mettre en privé le constructeur ? ⇒ insuffisant car la classe n’est
plus instanciable
Un traitement additionnel par une méthode autre que le
constructeur
Singleton : principe
<?php
class ClassSingleton
{
private static $_instance; // l’instance singleton de la
classe
private function __construct() { } // constructeur private
private function __clone() { } // clonage private
public static function getInstance()
{
if (!isset(self::$_instance)) // pas encore instanciee
{
self::$_instance = new self; // instanciation
}
return self::$_instance;
}
}
?>
Singleton : exemple
class ClassSingleton
{
private $_value;
private static $_instance;
private function __construct() { }
private function __clone() { }
public static function getInstance()
{
if (!isset(self::$_instance)) // pas encore
instanciee
{
self::$_instance = new self; //
instanciation
}
return self::$_instance;
}
02 Novembre 2017, POEC PHP 2017 10 / 34
Les design patterns : création Singleton
Singleton : exemple
Sémantique
Remarque
Évidemment, ce motif peut facilement être étendu pour permettre la
création d’un nombre bien déterminé d’instances
Sémantique
Problématique et solution
On veut automatiser par exemple l’instanciation d’une classe
(création d’objets)
ceci peut nous aider par exemple à remplir une table de notre
base de données avec des données aléatoires pour qu’on puisse
tester notre application
Déléguer la création d’objets à une classe Factory qui fabriquera
des objets en fonction de nos paramètres
Factory : exemple
//classe abstraite Personne
abstract class Personne{
private $_nom;
private $_prenom;
public function Nom(){
return $this->_nom;
}
public function Prenom(){
return $this->_prenom;
}
public function setNom($nom){
$this->_nom = $nom;
}
public function setPrenom($prenom){
$this->_prenom = $prenom;
}
abstract public function description();
}
02 Novembre 2017, POEC PHP 2017 14 / 34
Les design patterns : création Factory
Factory : exemple
// classe Etudiant heritant de Personne
class Etudiant extends Personne{
private $_niveau;
public function __construct($nom,$prenom,$niveau){
parent::setNom($nom);
parent::setPrenom($prenom);
$this->setNiveau($niveau);
}
public function Niveau(){
return $this->_niveau;
}
public function setNiveau($niveau){
$this->_niveau = $niveau;
}
public function description(){
echo ’<br/> Je suis Etudiant et je suis en ’ .
$this->Niveau();
}
}Novembre 2017, POEC PHP 2017
02 15 / 34
Les design patterns : création Factory
Factory : exemple
// classe Enseignant heritant de Personne
class Enseignant extends Personne{
private $_salaire;
...
public function description(){
echo "Je suis Enseignant et je touche " . $this->
Salaire();
}
}
// classe Administratif heritant de Personne
class Administratif extends Personne{
private $_affectation;
...
public function description(){
echo "Je suis Administratif et je suis affecte a
" . $this->Affectation();
}
}
02 Novembre 2017, POEC PHP 2017 16 / 34
Les design patterns : création Factory
Factory : exemple
include ’Personne.php’;
include ’Enseignant.php’;
include ’Etudiant.php’;
include ’Administratif.php’;
// classe de fabrication
class FactoryPersonne{
public static function build($nom,$prenom,$valeur,
$type){
if (class_exists($type)){
$instance = new $type($nom,$prenom,$valeur);
return $instance;
}
else{
throw new Exception(" classe $type
inexistante ");
}
}
}
02 Novembre 2017, POEC PHP 2017 17 / 34
Les design patterns : création Factory
Factory : exemple
try {
$etudiant = FactoryPersonne::build(’bob’,’joe’,’1er
annee licence’,’Etudiant’);
$etudiant->description();
// affiche Je suis Etudiant et je suis en 1er annee
licence
$agriculteur = FactoryPersonne::build(’jack’,’dalton’
,’raisin’, ’Agriculteur’);
// affiche classe Agriculteur inexistante
}
catch (Exception $e){
echo $e->getMessage();
}
Factory : exemple
Factory : exemple
Sémantique
Remarque
Évidemment, ces classes peuvent être utilisées avec des classes
manager pour alimenter une base de données
Sémantique
Problématique et solution
On veut utiliser une classe existante mais sa structure ne coı̈ncide
pas avec celle attendue
nom des méthodes
nombre d’attributs ou leurs types
Adapter : principe
// une interface IPersonne
interface IPersonne{
public function descriptionPersonne();
}
// une classe Enseignant qui implemente IPersonne
class Enseignant implements IPersonne{
private $_nom;
public function __construct($nom){
$this->_nom = $nom;
}
public function Nom(){
return $this->_nom;
}
public function setNom($nom){
$this->_nom = $nom;
}
public function descriptionPersonne(){
echo "</br> Je m’appelle " . $this->Nom();
}
}
02 Novembre 2017, POEC PHP 2017 23 / 34
Les design patterns : structure Adapter
Adapter : principe
Adapter : principe
Adapter : principe
Adapter : principe
// pour tester
$personne[0]= new Enseignant(’bob’);
$personne[1]= new Enseignant(’joe’);
$personne[2]= new EtudiantAdapter(new Etudiant(’mickael’,’1ere
annee licence’));
$personne[3]= new EtudiantAdapter(new Etudiant(’jack’,’2eme
annee master’));
foreach ($personne as $value)
{
$value->descriptionPersonne();
}
/*
le resultat est :
Je m’appelle bob
Je m’appelle joe
Je m’appelle mickael Je suis en 1ere annee licence
Je m’appelle jack Je suis en 2eme annee master
*/
Sémantique
Problématique et solution
on veut assurer la cohérence entre des classes coopérant entre
elles tout en maintenant leur indépendance
l’objet, dont on veut suivre le changement de ses états, doit
implémenter une interface qui offre trois méthodes permettant de
s’abonner (s’attacher, s’inscrire...), se désabonner et notifier les
abonnés
les objets qui veulent être informés doivent implémenter une
interface qui offre une méthode update()
Observer : exemple
Observer : exemple
Observer : exemple
public function subscribe(Observer $o){
$this->_observers[] = $o;
echo "<br/> une inscription : " . $o->Name();
}
public function unsubscribe(Observer $o){
$hint = array_search($o,$this->_observers,true);
if ($hint){
echo "<br/> une desinscription " . $this->
_observers[$hint]->Name();
unset($this->_observers[$hint]);
}
}
public function notify(){
for ($i=0;$i<count($this->_observers);$i++){
if (isset($this->_observers[$i])){
$this->_observers[$i]->update($this);
}
}
}
}
02 Novembre 2017, POEC PHP 2017 31 / 34
Les design patterns : comportement Observer
Observer : exemple
Observer : exemple
$m13 = new Footeux(’Marseillais’);
$p75 = new Footeux(’Parisien’);
$l69 = new Footeux(’Lyonnais’);
$om_psg = new Match(’0-0’);
$om_psg->subscribe($m13);
$om_psg->setScore(’1-0’);
$om_psg->subscribe($p75);
$om_psg->subscribe($l69);
$om_psg->setScore(’2-0’);
$om_psg->unsubscribe($p75);
$om_psg->setScore(’3-0’);
/* le resultat est : une inscription : Marseillais
changement de score OM - PSG 1-0
une inscription : Parisien
une inscription : Lyonnais
changement de score OM - PSG 2-0
changement de score OM - PSG 2-0
changement de score OM - PSG 2-0
une desinscription Parisien
changement de score OM - PSG 3-0 */
02 Novembre 2017, POEC PHP 2017 33 / 34
Liens utiles
Liens utiles
https://fr.wikipedia.org/wiki/Patron de conception