Para usar correctamente los patrones de estado y de política en aplicaciones Java, los desarrolladores deben saber claramente la diferencia entre los dos patrones. Aunque la estructura de los modos de estado y los modos de política es muy similar, también siguen el principio de apertura y cierre, que representan la 'O' del principio de diseño sólido, sus intenciones son completamente diferentes. El patrón de política en Java es encapsular un conjunto de algoritmos relacionados, proporcionando a las personas que llaman flexibilidad en tiempo de ejecución. La persona que llama puede elegir diferentes algoritmos en tiempo de ejecución sin modificar la clase de contexto utilizando la política. Los ejemplos clásicos del uso de patrones de políticas incluyen la implementación de algoritmos de cifrado, algoritmos de compresión y algoritmos de clasificación. Por otro lado, el modo de estado usa un objeto para mostrar diferentes comportamientos en diferentes estados. Los objetos en el mundo real también tienen estados, y se comportarán de manera diferente según sus estados. Por ejemplo, una máquina expendedora solo puede vender artículos en el estado de Hascoin. Si no metas monedas, no venderá bienes. Ahora puede ver claramente la diferencia entre el modo de política y el modo de estado, su propósito es diferente. El modo de estado ayuda a un objeto a administrar su estado, mientras que el modo de política permite a los clientes elegir diferentes comportamientos. Otra diferencia que no es fácil de ver es quién impulsa los cambios de comportamiento. En el modo de política, está impulsado por el cliente, que proporciona diferentes políticas para la información de contexto. En el modo de estado, la migración de estado es administrada por el contexto o el objeto de estado en sí. Del mismo modo, si modifica el estado en el objeto de estado, debe contener una referencia al contexto, lo que significa que para la máquina expendedora, puede llamar al método SetState para modificar el estado de contexto actual. Por otro lado, el objeto de política no tiene referencia al contexto, y su cliente pasa la política seleccionada al contexto. La estrategia y los patrones estatales son las preguntas de entrevista más fáciles sobre los patrones de diseño de Java. En este artículo sobre los patrones de diseño de Java, presentaremos esto en detalle. Exploraremos las similitudes y diferencias entre los dos modos, lo que ayudará a mejorar su comprensión de los dos modos.
Similitudes entre el modo de estado y el modo de política:
Si observa los gráficos UML de patrones de políticas y patrones de estado, se ven muy similares. En el modo de estado, el objeto que usa el objeto de estado para cambiar el comportamiento se denomina objeto de contexto. Del mismo modo, en el modo de estrategia, el objeto que usa el objeto de estrategia para cambiar el comportamiento también es un objeto de contexto. Recuerde, el cliente interactúa con el objeto de contexto. En el modo de estado, el contexto proxys la llamada del método del objeto de estado. El objeto actual en contexto es el objeto de estado específico. En el modo de política, el contexto opera también el objeto de política. Este objeto se pasa como parámetro o se proporciona al crear el objeto de contexto.
Echemos un vistazo a algunas similitudes entre estos dos patrones de diseño de Java central:
Tanto el modo de estado como el modo de política son fáciles de agregar nuevos estados o políticas sin afectar el uso de ambos siguen el principio de diseño de apertura y cierre, lo que significa que su diseño está abierto a extensiones y cerrado a modificaciones. En estos dos modos, el contexto está cerrado para la modificación y agrega un nuevo estado o una política. No necesita modificar el objeto de contexto en otros estados, o solo requiere pequeños cambios. Así como el objeto de contexto en el modo de estado tendrá un estado inicial, el contexto en el modo de política generalmente también tiene una política predeterminada.
El modo de estado encapsula diferentes comportamientos en la forma de diferentes objetos de estado, mientras que el modo de política encapsula diferentes comportamientos en la forma de diferentes objetos de política.
Ambos patrones se basan en subclases específicas para lograr un comportamiento específico. Cada política específica se extiende desde una clase de política abstracta, y cada estado también es una interfaz utilizada para representar a los estados o una subclase de la clase abstracta.
Instancia de modo de estado
Public Class WindowState {String private StateValue; Public WindowState (String StateValue) {this.stateValue = StateValue; } public String getStateValue () {return StateValue; } public void setStateValue (String StateValue) {this.stateValue = stateValue; } public void handle () { /** Haga diferentes operaciones de acuerdo con diferentes estados, y luego cambie el estado* / if ("ventana" .equals (stateValue)) {switchWindow (); this.stateValue = "pantalla completa"; } else if ("Fullscreen" .equals (StateValue)) {switchfullScreen (); this.stateValue = "Window"; }} private void switchWindow () {System.out.println ("Switch al estado de la ventana"); } private void switchfullScreen () {System.out.println ("cambiar al estado de pantalla completa"); }} / *** Uso del estado*/ public class WindowContext {private WindowState State; public WindowContext (WindowState State) {this.state = state; } public WindowState getState () {return State; } public void setState (WindowState State) {this.state = state; } public void switchState () {this.state.handle (); }} /** Estado (estado) Modo de comportamiento* Cambia tanto el estado del objeto como el comportamiento del objeto* Según el estado, cambie el comportamiento*/ clase pública test {public static void main (string [] args) {/** Solo hay dos valores de estado en este ejemplo, que están controlados por la clase de estado* también puede controlar el valor del estado y la mano sobre el cliente a la ventana de ventana de la ventana. context.switchState (); context.switchState (); context.switchState (); context.switchState (); context.switchState (); context.switchState (); }}Imprimir
Cambie al estado de la ventana al estado de pantalla completo al estado de la ventana al estado de pantalla completa
Ejemplo de modo de política
/ *** Promoción del producto* Esta categoría es: Cash Collection*/ Public Interface Icashsuper {Double AceptCash (doble dinero); } / ** * Colección de efectivo normal * @Author Stone * */ public Cashnormal implementos ICASHSuper {@Override public Double AcceptCash (Double Money) {return Money; }} / ** * El efectivo se recolecta con descuentos * @author Stone * */ public Cashrebate implementa ICASHSuper {RECUPO PRIVADO DOBLE; // descuento en efectivo público (reembolso doble) {this.rebate = reembolso; } @Override public Double AcceptCash (Double Money) {return New BigDecimal (dinero * reembolso / 10) .setscale (2, bigDecimal.round_half_up) .DoubleValue (); }} / ** * Reembolso en efectivo con efectivo * @author Stone * */ public CashReturn implementa ICASHSuper {Private Double MoneyCondition; // Cantaje de reembolso Mínimo Mínimo Privado Doble Retorno Money; // Cantidad de retorno pública CashReturn (doble MoneyCondition, Double Returnmoney) {this.MoneyCondition = MoneyCondition; this.returnMoney = returnmoney; } @Override public Double AcceptCash (Double Money) {// Rebato múltiple if (Money> = MoneyCondition) {return Money - Math.floor (Money/MoneyCondition) * ReturnMoney; } else {devolver dinero; }}} / *** Ejecutar el comportamiento correspondiente basado en la clase de política aprobada*/ public class CashContext {private iCashSuper Casher; public CashContext () {} public CashContext (Causer de IcashSuper) {this.casher = CHASHER; } public void setCasher (capiador de Icashsuper) {this.casher = chase; } // Según el objeto de política específico, el comportamiento del algoritmo de llamarlo público doble aceptación (doble dinero) {return this.casher.acceptcash (dinero); }} Prueba de clase pública {public static void main (string [] args) {double dinero = 998; // precio original CashContext CashContext = new CashContext (new CashNormal ()); System.out.println ("Precio original:" + CashContext.acceptCash (Money)); // Estrategia general CashContext.SetCasher (nuevo Cashrebate (8.5)); System.out.println ("85% de descuento:" + CashContext.acceptCash (Money)); // Estrategia de descuento 85% de descuento en CashContext.SetCasher (nuevo CashReturn (300, 50)); System.out.println ("Return 50 si es más de 300:" + CashContext.acceptCash (Money)); // estrategia de reembolso 50 si más de 300}}Imprimir
Precio original: 998.0 85% de descuento: 848.3 Reembolso para 50: 848.0 Más de 300
La diferencia entre el modo de política y el modo de estado
Hemos aprendido que los dos patrones son muy similares en estructura, pero aún tienen diferentes partes. Echemos un vistazo a algunas de las diferencias clave entre ellas.
Estas son todas las diferencias entre los patrones de política y los patrones de estado en Java. Como dije, se ven muy similares en los diagramas de UML, ambos siguen el principio de abrir y cerrar y encapsular el comportamiento. El modo de política se utiliza para encapsular algoritmos o políticas. Se proporcionará al objeto de contexto como un parámetro o objeto combinado en tiempo de ejecución, mientras que el modo de estado se utiliza para administrar la migración de estado.