creo que está quizá limitando a pensar sólo en términos de los objetos que implementan el modelo de estado (objeto Contexto y objetos del Estado). Este no es el caso, y hay otros objetos involucrados (Clientes). Es posible que el cliente, que tiene una referencia al objeto de contexto, tenga la responsabilidad del estado de transición.
considerar esta formada por ejemplo:
// Paintbrush is the context object
class Paintbrush {
// The State object, ColourState would be the abstraction
private ColourState colourState;
// ... other class stuff
public paint() {
// Delegation to the state object
this.colourState.paintInYourSpecificColour();
}
public void setColourState(ColourState newState) {
this.colourState = newState;
}
}
Esto debería ser suficiente para la ejecución del objeto de contexto. Tenga en cuenta que ni colourState
ni la clase Paintbrush
tienen ningún conocimiento de las transiciones de estado. Esto es para reducir el número de responsabilidades, así como para proporcionar un diseño más flexible.
Básicamente, los cambios de estado podrían ser responsabilidad de la clase de llamada. Cómo se logra esto realmente en el código es el detalle de la implementación, pero lo importante es notar que ni el objeto de contexto ni el objeto de estado tienen la responsabilidad del estado de transición.
Estoy tratando de asegurarme de que no utilizo un argumento de Strawman, pero seguiré usando el ejemplo. Dicen en diferentes puntos que quería pintar diferentes patrones, y los colores utilizados deben estar en un orden específico, su cliente sería decidir cuándo cambiar de estado, así:
public void paintRainbow() {
paintbrush.setColourState(new RedColourState());
// do painting...
// Change state to next colour
paintbrush.setColourState(new OrangeColourState());
// Chane state again, and so on...
}
Usted podrían tener el orden de los colores especificado por el estado o el objeto de contexto, es decir. tener una subclase de Paintbrush
llamada RainbowPaintbrush
, y elegiría el siguiente color.O bien, los objetos de su estado podrían elegir el siguiente estado, en cuyo caso tendría que tener un RedRainbowColourState
, que sabía que el siguiente estado era OrangeRainbowColourState
y así sucesivamente. Pero el problema con estos dos ejemplos es que debe ingresar y modificar (por extensión) el contexto y los objetos de estado para lograr un conjunto diferente de transiciones. Sin embargo, si ninguno conoce las transiciones, y esa es la responsabilidad de la clase de llamada, esto se puede hacer sin cambiar el estado o el objeto de contexto. Es decir.
public void paintChessboard() {
paintbrush.setColourState(blackColourState);
// do painting...
// change state
paintbrush.setColourState(whiteColourState);
// etc...
}
Este es un ejemplo simplificado, pero en general es válido.
Una lectura rápida de Wikipedia example of the State pattern muestra que los estados individuales tienen conocimiento del siguiente estado, por lo que no creo que no sea válido. Supongo que, en general, es una compensación de dónde quiere que esté el control y cómo encajará en su problema. Se trata de cómo el uso de los objetos de estado de transición concretas para encajaría en mi ejemplo cojo:
public class RedRainbowColourState implements ColourState {
public void doPaint(Paintbrush paintbrush) {
// do painting
ColourState nextStateInRainbow = new OrangePaintbrushColourState();
paintbrush.setColourState(nextStateInRainbow);
}
Pero tenga en cuenta la explosión de las clases de estado que serán necesarias para la transición a través de todos los estados que utilizan este camino. Sin embargo, una ventaja aquí es que el cliente puede ser relevado de la responsabilidad y el conocimiento de cómo crear los estados individuales. En su situación, esa puede ser una mejor forma de transición.
En resumen, puede dejar que los estados individuales realicen la transición, o incluso el objeto de contexto. Otra opción es dejar que el cliente maneje las transiciones de estado.
Una de sus etiquetas está mal escrita. No puedo solucionarla porque no tengo suficiente reputación. –
Como mencionaste que el estado 'actual' puede decidir cuál será el siguiente estado, entonces el segundo enfoque no solo es un mejor enfoque sino también la forma correcta de hacerlo. – Anurag
FYI: patrones de diseño Mindmap: http://www.mindmeister.com/7008138/design-patterns – jldupont