« Patrons de conception/Chaîne de responsabilité » : différence entre les versions

Contenu supprimé Contenu ajouté
Ligne 12 :
Une variante de ce patron de conception est un arbre de responsabilité, où chaque nœud de traitement transmet l'objet non plus à un seul autre nœud mais à plusieurs nœuds (exemple : un interpréteur de document XML).
 
== Exemples ==
== Un exemple en langage C++ ==
 
=== [[Programmation C++|C++]] ===
 
L'exemple ci-dessous présente un système de journalisation (''log'' en anglais).
Ligne 114 ⟶ 116 :
}
</source>
 
=== [[Programmation Java|Java]] ===
 
Le même exemple que le précédent, en Java.
 
<source lang="java">
import java.util.*;
 
abstract class Logger
{
public static final int
ERR = 0,
NOTICE = 1,
DEBUG = 2;
 
protected int level;
 
protected Logger(int level)
{
this.level = level;
this.next = null;
}
 
// The next element in the chain of responsibility
protected Logger next;
public Logger setNext( Logger l)
{
next = l;
return l;
}
 
public void message( String msg, int priority )
{
if ( priority <= level )
writeMessage( msg );
 
if ( next != null )
next.message( msg, priority );
}
abstract protected void writeMessage( String msg );
}
 
class StdoutLogger extends Logger
{
public StdoutLogger( int level ) { super(level); }
 
protected void writeMessage( String msg )
{
System.out.println( "Writing to stdout: " + msg );
}
}
 
 
class EmailLogger extends Logger
{
 
public EmailLogger( int level ) { super(level); }
 
protected void writeMessage( String msg )
{
System.out.println( "Sending via email: " + msg );
}
}
 
class StderrLogger extends Logger
{
 
public StderrLogger( int level ) { super(level); }
 
protected void writeMessage( String msg )
{
System.err.println( "Sending to stderr: " + msg );
}
}
 
public class ChainOfResponsibilityExample
{
public static void main( String[] args )
{
// Construire la chaîne de responsabilité
Logger l,l1;
l1 = l = new StdoutLogger( Logger.DEBUG );
l1 = l1.setNext(new EmailLogger( Logger.NOTICE ));
l1 = l1.setNext(new StderrLogger( Logger.ERR ));
 
// Traité par StdoutLogger
l.message( "Entering function y.", Logger.DEBUG );
 
// Traité par StdoutLogger et EmailLogger
l.message( "Step1 completed.", Logger.NOTICE );
 
// Traité par les trois loggers
l.message( "An error has occurred.", Logger.ERR );
}
}
</source>
 
Ce programme affiche :
Writing to stdout: Entering function y.
Writing to stdout: Step1 completed.
Sending via e-mail: Step1 completed.
Writing to stdout: An error has occurred.
Sending via e-mail: An error has occurred.
Writing to stderr: An error has occurred.