Hemos discutido un ejemplo de luchador e introducido el Patrón de estrategia en el set 1.
Patrón de estrategia | Serie 1 (Introducción)
En esta publicación, aplicamos el patrón de estrategia al problema del luchador y discutimos la implementación.
El primer paso es identificar los comportamientos que pueden variar en diferentes clases en el futuro y separarlos del resto. Para nuestro ejemplo, sean comportamientos de patadas y saltos. Para separar estos comportamientos, sacaremos ambos métodos de la clase Fighter y crearemos un nuevo conjunto de clases para representar cada comportamiento.
La clase Fighter ahora delegará su comportamiento de patada y salto en lugar de usar los métodos de patada y salto definidos en la clase Fighter o su subclase.
Después de volver a trabajar, el diagrama de clase final sería (Haga clic en la imagen para ver mejor):
Al comparar nuestro diseño con la definición del patrón de estrategia, los comportamientos de patada y salto encapsulados son dos familias de algoritmos. Y estos algoritmos son intercambiables como es evidente en la implementación.
A continuación se muestra la implementación en Java del mismo.
// Java program to demonstrate implementation of // Strategy Pattern // Abstract as you must have a specific fighter abstract class Fighter { KickBehavior kickBehavior; JumpBehavior jumpBehavior; public Fighter(KickBehavior kickBehavior, JumpBehavior jumpBehavior) { this.jumpBehavior = jumpBehavior; this.kickBehavior = kickBehavior; } public void punch() { System.out.println("Default Punch"); } public void kick() { // delegate to kick behavior kickBehavior.kick(); } public void jump() { // delegate to jump behavior jumpBehavior.jump(); } public void roll() { System.out.println("Default Roll"); } public void setKickBehavior(KickBehavior kickBehavior) { this.kickBehavior = kickBehavior; } public void setJumpBehavior(JumpBehavior jumpBehavior) { this.jumpBehavior = jumpBehavior; } public abstract void display(); } // Encapsulated kick behaviors interface KickBehavior { public void kick(); } class LightningKick implements KickBehavior { public void kick() { System.out.println("Lightning Kick"); } } class TornadoKick implements KickBehavior { public void kick() { System.out.println("Tornado Kick"); } } // Encapsulated jump behaviors interface JumpBehavior { public void jump(); } class ShortJump implements JumpBehavior { public void jump() { System.out.println("Short Jump"); } } class LongJump implements JumpBehavior { public void jump() { System.out.println("Long Jump"); } } // Characters class Ryu extends Fighter { public Ryu(KickBehavior kickBehavior, JumpBehavior jumpBehavior) { super(kickBehavior,jumpBehavior); } public void display() { System.out.println("Ryu"); } } class Ken extends Fighter { public Ken(KickBehavior kickBehavior, JumpBehavior jumpBehavior) { super(kickBehavior,jumpBehavior); } public void display() { System.out.println("Ken"); } } class ChunLi extends Fighter { public ChunLi(KickBehavior kickBehavior, JumpBehavior jumpBehavior) { super(kickBehavior,jumpBehavior); } public void display() { System.out.println("ChunLi"); } } // Driver class class StreetFighter { public static void main(String args[]) { // let us make some behaviors first JumpBehavior shortJump = new ShortJump(); JumpBehavior LongJump = new LongJump(); KickBehavior tornadoKick = new TornadoKick(); // Make a fighter with desired behaviors Fighter ken = new Ken(tornadoKick,shortJump); ken.display(); // Test behaviors ken.punch(); ken.kick(); ken.jump(); // Change behavior dynamically (algorithms are // interchangeable) ken.setJumpBehavior(LongJump); ken.jump(); } }
Producción :
Ken Default Punch Tornado Kick Short Jump Long Jump
Referencias:
Patrones de diseño Head First
Este artículo es una contribución de Sulabh Kumar . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo electrónico a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA