JavaRush /Blog Java /Random-ES /Estrategia de plantilla (Estrategia)

Estrategia de plantilla (Estrategia)

Publicado en el grupo Random-ES
El patrón Estrategia define una familia de algoritmos, encapsula cada uno de ellos y garantiza que sean intercambiables. Permite modificar algoritmos independientemente de su uso en el lado del cliente (esta definición está tomada del libro “Head First. Design Patterns” de Eric Freeman y Elizabeth Robson). Esta definición parece un poco confusa, por lo que debemos explicarla con más detalle en lenguaje normal . Empecemos por la religión :) Hay muchas religiones en el mundo (confesiones, movimientos, creencias, etc.). ¿Cómo podríamos describir esto en código? Bueno, por ejemplo, podríamos tomar la clase de Religión y heredar otras religiones de ella. abstraigamos las cosas innecesarias y usemos un método believe() en la clase Religión.
public abstract class Religion {
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
Todas las demás religiones pueden heredarse de esta clase. Si nos hubiéramos limitado al cristianismo e incluso al islam y al judaísmo, entonces no habría habido problemas.
public class Judaism extends Religion {
}
public class Islam extends Religion {
}
public class Christianity extends Religion {
}
Pero si piensas en las otras religiones que existen ahora (o que existieron antes, pero desaparecieron), entonces surgirán problemas, al menos con los budistas. Tendrás que anular su método de creencia.
public class Buddhism extends Religion {
    @Override
    public void believe() {
        System.out.println("Есть Бог o боги o нет, это не важно, главное достичь нирваны :)");
    };
}
Y como hay muchas religiones e incluso creen en el monstruo de la pasta (pastafarianismo), entonces en todas estas religiones tendrás que redefinir el método de creer. Pero, ¿podemos hacerlo de manera diferente, mover este método a la interfaz Faith e implementar el método creer en él e implementar este método en cada clase (y en consecuencia implementarlo en cada clase como queramos)? Pero entonces tendremos duplicación de código, bueno, al menos entre judíos y cristianos. Los musulmanes de Dios pueden escribir en árabe.
public interface Faith {
    public void believe();
}
public class Christianity implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
public class Judaism implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
Implementar el método predeterminado no ayudará mucho aquí; hay tantas religiones que incluso si define este método de forma predeterminada en la interfaz Faith, tendrá que implementar este método a su manera en todas las religiones no monoteístas y repetirlo. en algún lugar. ¿Qué nos ofrece el patrón Estrategia en este caso? Ofrece crear clases de plantilla listas para usar para la interfaz actual, que luego se sustituirán en el constructor de una religión específica. Aquellos. definir y crear la misma familia de algoritmos que se mencionó al principio de la definición.
public interface Faith {
    public void believe();
}
public class AbrahamicReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
public class BuddismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Есть Бог o боги o нет, это не важно, главное достичь нирваны :)");
    }
}
public class JediismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Да пребудет с вами Сила!");
    }
}
Y en cada clase del constructor, sustitúyelos.
public abstract class Religion {
    Faith faith;
}
public class Judaism extends Religion{

    public Judaism() {
        this.faith = new AbrahamicReligion();
    }
}
public class Christianity extends Religion{

    public Christianity() {
        this.faith = new AbrahamicReligion();
    }
}
public class Buddhism extends Religion {

    public Buddhism() {
        this.faith = new BuddismReligion();
    }
}
Por lo tanto, si necesita incluir otra religión en su proyecto, no tendrá que redefinir el método de creencia para todas las clases o partes de las clases. Y sólo necesitarás implementar la clase que falta (si ya no hay ninguna) que implemente la interfaz Faith y agregar esta clase en el constructor de la nueva religión.
public class PastafarianismReligion implements Faith{

    @Override
    public void believe() {
        System.out.println("Кто съел мои макароны???");
    }
}
public class Pastafarianism extends Religion {

    public Pastafarianism() {
        this.faith = new PastafarianismReligion();
    }
}
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION