Pregunta

Cómo funciona, para qué sirve y cuándo se debe utilizar?

¿Fue útil?

Solución

Vamos a explicar el patrón de estrategia de la manera más fácil:

Usted tiene una clase Car() con un método run(), por lo que usarlo de esta manera en un pseudo lenguaje:

mycar = new Car()
mycar.run()

Ahora, es posible que desee cambiar el run() comportamiento en la marcha, mientras el programa se está ejecutando.Por ejemplo, usted podría querer simular un fallo del motor o el uso de un "impulso" en un juego de video.

Hay varias maneras de hacer esto de la simulación:el uso de sentencias condicionales y una variable de indicador es de una manera.La estrategia es el patrón de otro:delega el comportamiento de la run() método de otra clase:

Class Car()
{
    this.motor = new Motor(this) 

    // passing "this" is important for the motor so it knows what it is running

    method run()
    {
        this.motor.run()
    }

    method changeMotor(motor)
    {
        this.motor = motor 
    }

}

Si desea cambiar comportamiento del coche, usted puede cambiar el motor.(Más fácil en un programa que en la vida real, ¿verdad?;-) )

Es muy útil si usted tiene un montón de complejos estados:usted puede cambiar y mantener ellos mucho más fácilmente.

Otros consejos

Problema

El patrón de estrategia se utiliza para resolver problemas que pueden (o se prevé que podría) ser implementadas o resueltos por diferentes estrategias de y que poseen una clara interfaz definida para tales casos.Cada estrategia es perfectamente válido en su propio con algunas de las estrategias que están siendo preferible en ciertas situaciones que permitan la aplicación para cambiar entre ellos durante el tiempo de ejecución.

Ejemplo De Código

namespace StrategyPatterns
{
  // Interface definition for a Sort algorithm
  public interface ISort
  {
    void Sort(List<string> list)
  }

  // QuickSort implementation
  public class CQuickSorter : ISort
  {
    void Sort(List<string> list)
    {
      // Here will be the actual implementation
    }
  }

  // BubbleSort implementation
  public class CBubbleSort : ISort
  {
    void Sort(List<string> list)
    {
      // The actual implementation of the sort
    }
  }

  // MergeSort implementation
  public class CMergeSort : ISort
  {
    void Sort(List<string> list)
    {
      // Again the real implementation comes here
    }
  }

  public class Context
  {
    private ISort sorter;

    public Context(ISort sorter)
    {
      // We pass to the context the strategy to use
      this.sorter = sorter;
    }

    public ISort Sorter
    {
      get{return sorter;)
    }
  }

  public class MainClass
  {
    static void Main()
    {
       List<string> myList = new List<string>();

       myList.Add("Hello world");
       myList.Add("Another item");
       myList.Add("Item item");

       Context cn = new Context(new CQuickSorter());
       // Sort using the QuickSort strategy
       cn.Sorter.Sort(myList);
       myList.Add("This one goes for the mergesort");
       cn = new Context(new CMergeSort());
       // Sort using the merge sort strategy
       cn.Sorter.Sort(myList);
    }
  }
}
  • ¿Qué es una Estrategia?Una estrategia es un plan de acción diseñado para lograr un objetivo específico;
  • "Define una familia de algoritmos, encapsula cada uno de ellos, y hacerlos intercambiables.La estrategia permite que el algoritmo de variar independientemente de los clientes que lo utilizan." (Gang of Four);
  • Especifica un conjunto de clases, cada uno representando un potencial de comportamiento.La conmutación entre las clases cambios en el comportamiento.(la Estrategia);
  • Este comportamiento puede ser seleccionada en tiempo de ejecución (utilizando polimorfismo) o en tiempo de diseño;
  • La captura de la abstracción en una interfaz, enterrar a los detalles de implementación en las clases derivadas;

enter image description here

  • Una alternativa a la Estrategia es cambiar el comportamiento mediante el uso de lógica condicional.(MALO);
  • El uso de este patrón hace que sea más fácil agregar o quitar específicos de comportamiento, sin tener que recodificar y retest, el todo o las partes de la solicitud;

  • Buenos usos:

    • Cuando tenemos un conjunto de algoritmos similares y de la necesidad de cambiar entre ellos en diferentes partes de la aplicación.Con el modelo de Estrategia es posible evitar ifs y facilidad de mantenimiento;
    • Cuando queremos añadir nuevos métodos a la superclase que no necesariamente tienen sentido para cada subclase.En lugar de utilizar una interfaz en una forma tradicional, añadiendo el nuevo método, se utiliza una variable de instancia que es una subclase de la nueva Funcionalidad de la interfaz.Esto se conoce como Composición :En lugar de heredar una habilidad a través de la herencia de la clase se compone de Objetos con el derecho de la capacidad;

Estrechamente relacionada con el patrón es el patrón de Delegado;en ambos casos, algunos de los trabajos se pasa a algún otro componente.Si he entendido bien, la diferencia entre estos patrones es esto (y por favor corríjanme si estoy equivocado):

  • En el Delegado patrón, el delegado es instanciado por las envolventes (delegar) de la clase;esto permite la reutilización de código mediante la composición en lugar de la herencia.La clase envolvente puede ser consciente de que el delegado del tipo concreto, por ejemplo,si se invoca el constructor de sí mismo (en contraposición con el uso de una fábrica).

  • En el Estrategia patrón, el componente que ejecuta la estrategia es una dependencia siempre a la envolvente (el uso de) componente a través de su constructor o un setter (de acuerdo a su religión).El uso de componentes es totalmente inconsciente de lo que la estrategia está en uso;la estrategia es siempre invoca a través de una interfaz.

Alguien sabe alguna otra diferencia?

Directamente desde el El modelo de estrategia de artículo de la Wikipedia:

El patrón de estrategia es útil para situaciones donde es necesario cambiar dinámicamente de los algoritmos utilizados en una aplicación.La estrategia es el patrón de la intención de proporcionar un medio para definir una familia de algoritmos, encapsula cada uno como un objeto, y hacerlos intercambiables.El patrón de estrategia permite a los algoritmos variar independientemente de los clientes que hacen uso de ellos.

Para añadir a la ya magníficas respuestas:El patrón de estrategia tiene una fuerte similitud a la aprobación de una función (o funciones) a otra función.En la estrategia, esto se realiza mediante un ajuste de dicha función en un objeto, seguido por pasar el objeto.Algunos idiomas puede pasar a las funciones directamente, por lo que no necesitan el patrón.Pero otros idiomas no pueden pasar a las funciones, pero puede pasar objetos;el patrón y luego se aplica.

Especialmente en Java-como idiomas, usted encontrará que el tipo zoológico de la lengua es bastante pequeña y que su única forma de extender es mediante la creación de objetos.Por lo tanto la mayoría de las soluciones a los problemas que está por venir para arriba con un patrón;una manera de componer objetos para alcanzar un objetivo específico.Los idiomas más ricos del tipo de los zoológicos suelen tener más simples maneras de ir sobre los problemas, pero más ricos tipos también significa que usted tiene que gastar más de tiempo para aprender el sistema de tipos.Lenguajes con tipado dinámico de la disciplina a menudo se presenta de una manera disimulada de todo el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top