2010-04-01 27 views
5

Quiero diseñar una clase, que contiene un procedimiento para lograr un objetivo. Y debe seguir un cierto orden para asegurarse de que el último método, digamos "ExecuteIt", se comporte correctamente. en tal caso, ¿qué patrón de diseño usará? que puede asegurar que el usuario debe llamar al método público de acuerdo con algún pedido.¿Qué patrón de diseño elegirás?

Si realmente no sabe lo que estoy diciendo, entonces me puede compartir algún concepto de la elección de un golpeteo de diseño, o lo que le cuenta al diseñar una clase?

+1

¿Hay algún motivo específico por el que los métodos deban llamarse uno por uno? –

Respuesta

4

Plantilla Método es lo que quieres. Es uno de los más antiguos, simplemente una formalización de una forma de componer tus clases.

http://en.wikipedia.org/wiki/Template_method_pattern

o como en este ejemplo de código:

abstract class AbstractParent // this is the template class 
{ 
    // this is the template method that enforces an order of method execution 
    final void executeIt() 
    { 
    doBefore(); // << to be implemented by subclasses 
    doInTheMiddle() // also to be implemented by subclasses 
    doLast(); // << the one you want to make sure gets executed last 
    } 

    abstract void doBefore(); 
    abstract void doInTheMiddle(); 
    final void doLast(){ .... } 
} 

class SubA extends AbstractParent 
{ 
    void doBefore(){ ... does something ...} 
    void doInTheMiddle(){ ... does something ...} 
} 

class SubB extends SubA 
{ 
    void doBefore(){ ... does something different ...} 
} 

Pero parece que está pescando para la oportunidad de utilizar un patrón en lugar de utilizar un patrón para resolver un determinado tipo de problema. Eso solo lo llevará a malos hábitos de desarrollo de software.

No piense en patrones. Piense en cómo resolvería ese problema específico sin tener patrones.

Imagine que no había patrones codificados (que es como era antes). ¿Cómo lograrías lo que quieres hacer aquí (que es lo que hicieron las personas para resolver este tipo de problemas)? Cuando puedas hacer eso, entonces estarás en una posición mucho mejor para entender los patrones.

No los use como cortadores de galletas. Eso es lo último que quieres hacer.

+2

. Tengo que aclarar esto, no quiero decir que los patrones sean inútiles. Son una de las mejores cosas que se le ocurren a la Informática en lo que respecta a la reutilización y la composición. Sin embargo, requiere conocer la composición, la herencia y el polimorfismo por sí mismos (y en menor grado, conceptos como la cohesión y el acoplamiento). Una persona que sabe cómo usar patrones de manera efectiva es la que sabe cómo surgir con soluciones que se basan estrictamente en los conceptos mencionados anteriormente. Los patrones le dan una estructura documentada, pero necesita tener una base sólida antes de poder usarlos. –

6

creo que busca el patrón Template Method.

+0

Wow, eres genial, ¿cómo puedes recordar todos los patrones? – MemoryLeak

+0

@duffymo: El Método de la plantilla también es un patrón GoF, y se ajusta mejor a la descripción que la estrategia –

+0

. Tendré que volver a leerlo. Gracias por la corrección. – duffymo

3

Básicamente no es un patrón, pero: si quiere asegurarse de que el código/métodos se ejecute en un orden específico, haga que la clase tenga solo un método público, que luego llama a los métodos no públicos de la derecha secuencia.

0

Como concepto general que debe elegir un patrón como una solución estándar a un problema estándar es así, estoy de acuerdo con Oded, el "Método de plantillas" parece ajustarse a sus necesidades (pero lo que se ha explicado es demasiado pocos tal vez) No te patrón de uso como "fetiche", lo que tiene que tener en cuenta es:

  1. ¿Cómo puedo calcular mi problema de una manera estándar?
  2. ¿Hay un patrón para esto?
  3. ¿Es esta la manera más simple?
2

Creo que no tienes que ejecutar realmente nada, solo prepara las declaraciones, recursos y lo que quieras. De esta forma, cualquiera que sea el orden en que el usuario invoque los métodos, se asegurará que se ordenará la ejecución real; simplemente porque tienes el control total sobre la ejecución real, justo antes de ejecutarla.

mi humilde opinión Método Plantilla muy poco que ver con su objetivo.

EDIT: sea más clara. Haga que su clase tenga un método público Execute, y una cantidad de otros métodos públicos para decirle a su clase qué hacer (cuándo hacerlo es responsabilidad de usted y no del usuario); a continuación, realice una serie de métodos privados que realicen el trabajo real; se invocarán en el en el orden correcto mediante su ejecución, una vez que el usuario haya finalizado las configuraciones.

dar al usuario la capacidad de ajuste, mantenga ejecución para su auto. Él dice qué, tú decides cómo.

+0

y varios otros métodos públicos para decirle a su clase qué hacer (cuándo hacerlo es su responsabilidad, no del usuario); ¿Puedes explicar esto con más detalle? – MemoryLeak

0

Template Method es racional, si usted tiene una jerarquía de clases y la clase base define los pasos de operación protegida en su método de plantillas públicas. ¿Podrías elaborar tu pregunta?

3

El enfoque simple y pragmático para aplicar una secuencia particular de pasos en cualquier API es definir una colección de clases (en lugar de solo una clase) de modo que cada siguiente paso válido tome como parámetro un objeto derivado del paso anterior, es decir:

Fuel coal = CoalMine.getCoal(); 
    Cooker stove = new Cooker (gas); 

    Filling apple = new AppleFilling(); 
    Pie applePie = new Pie(apple); 

    applePie.bake(stove); 

eso quiere decir que a hornear un pastel es necesario proporcionar un objeto Cooker que a su vez requiere algún tipo de un combustible adecuado para ejecutarse en primer lugar. Del mismo modo, antes de que pueda obtener un instanse de un pastel, tendrá que preparar algo de relleno.

En este caso, la semántica del uso de API se aplica explícitamente por su sintaxis. Mantenlo simple.

+0

¿Hay un nombre para este patrón de diseño? – ALOToverflow

+0

Frank, no tiene un nombre que yo sepa. Pero el "Patrón de diseño de sistema tipo" podría funcionar. –

+0

Creo que es un patrón de decorador, pero como en mi clase solo hago una cosa, creo que no es tan bueno usar la clase múltiple – MemoryLeak