Strategy

La programmation avec design patterns

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com
Le contexte permet de comprendre pas mal de choses, également en développement. Certaines situations exigent sa présence pour pouvoir déterminer la stratégie à prendre. C'est d'ailleurs le mot-clé qui définit le design pattern de cet article.

Il s'agira bel et bien du patron de conception appelé strategy (stratégie). Son but consiste à créer une surcouche qui va être utilisée par le contexte dans la réalisation d'une opération. L'opération à réaliser sera toujours la même. Par contre les classes la réalisant seront différentes en fonction de la demande du client.

Pour illustrer ce propos, prenons l'exemple d'une opération de prononciation. Si l'on veut prononcer un mot de son début à sa fin, on utilisera la classe Normal. Elle contiendra la méthode spell() qui "dira" un mot normalement. Par contre, si l'on voudra prononcer le mot de la fin au début, on utilisera une classe nommée Inverse. Sa méthode spell() retournera le mot lu à partir des dernières lettres. On observe donc que l'action demandée est la même pour les deux. Les deux classes doivent prononcer un mot. Par contre l'implémentation diffère et dépend de la demande transmis au contexte.


On peut distinguer 4 acteurs participants dans ce patron de conception :
- strategy (stratégie) : la définition d'une opération.
- concrete strategy (stratégie concrète) : la réalisation précise de l'opération définie dans la stratégie.
- context (contexte) : le décisionnaire qui choisit la stratégie à adopter.
- client : le demandeur d'une stratégie.

Exemple du strategy
Pour mieux comprendre le cas du strategy, on utilisera l'opération de construction d'une maison (stratégie). Cependant, la construction ne sera pas la même en fonction de la demande du client (stratégie concrète). Mais c'est le constructeur (contexte) qui déterminera si la construction pourra avoir lieu.


interface House {
public void constructHouse();
}


class WoodenHouse implements House {
@Override
public void constructHouse() {
System.out.println("Construct house with wood");
}
}

class BrickRedHouse implements House {
@Override
public void constructHouse() {
System.out.println("Construct house with brick red");
}
}

Ces trois éléments représentent la partie stratégique. L'interface House est en fait une stratégie qui définit l'opération à effectuer sous la méthode constructHouse(). En ce qui concerne les deux classes, elles sont des exemples d'une stratégie concrète.


class HouseContext {
private House house;

public void setHouse(House house) {
this.house = house;
}

public void startConstruction() {
this.house.constructHouse();
}

}

HouseContext est le contexte qui détermine quel type de construction sera invoquée.


HouseContext c = new HouseContext();
c.setHouse(new BrickRedHouse());
c.startConstruction();

Et ci-dessus le client qui désire la construction de la maison de ses rêves.


Construct house with brick red

Ce fragment représente le résultat du traitement.

Comme on a pu voir dans l'article, le design pattern strategy délègue tout le travail à un contexte. Le client passe alors à chaque fois par ce dernier et n'invoque pas directement l'opération à effectuer. Ce niveau d'abstraction supplémentaire minimalise le couplage entre des participants, en faisant toute manipulation plus facile à réaliser. Ce type de développement s'appelle programming to interface.
Bartosz KONIECZNY 01-07-2014 00:00 design patterns
Moi

Développeur d'applications Internet et journaliste passionné par l'adjectif français. Un aigle polonais orienté vers la progression, volant très haut et écoutant du zouk après les matches du foot français.

Vous appréciez mon travail ?

Pour contribuer au développement de ce site, ou pour remercier pour des articles rédigés, vous pouvez faire un don.

Un conseil Symfony2

A quoi peut être lié le problème "Unknown Entity namespace alias" ?

Ce problème peut apparaître dans Symfony2 parce que le bundle de l'entité peut ne pas être défini dans AppKernel.