Capítulo 2 Patrón de diseño de Caché Patrón estratégico

Capítulo 2 Patrón de diseño de Caché Patrón estratégico

Definición

  • El patrón de estrategia es un método para definir una serie de algoritmos. Desde un punto de vista conceptual, todos estos algoritmos hacen el mismo trabajo, pero solo se implementan de manera diferente. Pueden llamar a todos los algoritmos de la misma manera, reduciendo varias clases de algoritmos. Acoplamiento con clases usando algoritmos.

Usar escena

  • Ocultar los detalles de implementación de estrategias específicas de los clientes, completamente independientes entre sí
  • Múltiples formas de lidiar con el tipo de consentimiento, solo cuando el comportamiento específico es diferente
  • Muchos comportamientos se definen en una clase, y las operaciones de estos comportamientos en esta clase aparecen en forma de múltiples declaraciones condicionales.

Ventaja

  • Prueba unitaria simplificada, porque cada algoritmo tiene su propia clase, que se puede probar por separado a través de su propia interfaz
  • Use el patrón de estrategia uno para evitar el uso de múltiples declaraciones condicionales, que no son fáciles de mantener y propensas a errores. Elimine el exceso si anida de otra manera
  • Fácil de ampliar. Cuando necesita agregar una estrategia, solo necesita implementar la interfaz.

Desventajas

  • Cada estrategia es una clase, con baja reutilización. Si hay demasiadas estrategias, el número de clases aumentará
  • El módulo de capa superior debe saber qué estrategias son para poder usar estas estrategias, lo cual es contrario al principio de Dimit

La diferencia entre el modelo de fábrica simple y el modelo de estrategia

  • El patrón de fábrica es principalmente el objeto instanciado de la clase de implementación de interfaz devuelta, y el resultado final devuelto es el método en la clase de implementación de interfaz.
  • El patrón de estrategia ya está creado cuando se instancia el patrón de estrategia, y podemos empalmar y reescribir métodos en el patrón de estrategia a voluntad.
  • El modelo de fábrica no importa cómo se empalme el método, solo presta atención al resultado final, no al proceso, y el modelo estratégico se enfoca en el proceso.
  • Lo que puede hacer el modelo de fábrica, el modelo de estrategia puede hacerlo.
  • Lo que puede hacer el modelo de estrategia, el modelo de fábrica también puede hacerlo, pero será problemático.
  • El patrón de fábrica solo se ocupa de las instancias de producción. La persona que llama determina el uso de la instancia de fábrica. El patrón de estrategia consiste en colocar la estrategia de uso de la instancia generada en la clase de estrategia y luego proporcionarle al llamante que la use.
  • El llamador de modo de fábrica puede llamar directamente al atributo de método de la instancia de fábrica, etc., el modo de estrategia no puede llamar directamente al atributo de método de la instancia y debe llamarse después de encapsular la estrategia en la clase de estrategia.

Ejemplo:
puedes combinar trucos a voluntad y agregar tres métodos de lucha ThreeFighting (). El método de fábrica debe llamarse tres veces.

Class PHA.YX.Design.Strategy.Context Extends %RegisteredObject
{

Property mFightingStrategy As PHA.YX.Design.Strategy.FightingStrategy;

Method %OnNew(fightingStrategy As PHA.YX.Design.Strategy.FightingStrategy) As %Status [ Private, ServerOnly = 1 ]
{
	s ..mFightingStrategy=fightingStrategy
	Quit $$$OK
}

Method Fighting()
{
	d ..mFightingStrategy.Fighting()
}

Method ThreeFighting()
{
	d ..mFightingStrategy.Fighting()
	d ..mFightingStrategy.Fighting()
	d ..mFightingStrategy.Fighting()
}

}
/// d ##class(PHA.YX.Design.Program).Strategy() 
ClassMethod Strategy()
{
	#dim context as PHA.YX.Design.Strategy.Context
	s context = ##class(PHA.YX.Design.Strategy.Context).%New(##class(PHA.YX.Design.Strategy.CommonRivalStrategy).%New())
	d context.Fighting()
	s context = ##class(PHA.YX.Design.Strategy.Context).%New(##class(PHA.YX.Design.Strategy.StrongRivalStrategy).%New())
	d context.Fighting()
	s context = ##class(PHA.YX.Design.Strategy.Context).%New(##class(PHA.YX.Design.Strategy.WeakRivalStrategy).%New())
	d context.Fighting()
	d context.ThreeFighting()
	q ""
}

Diagrama de estructura

Ejemplo completo

Descripción

  • De acuerdo con los diferentes niveles de oponentes, especifique diferentes planes.

Definir interfaz de políticas

Class PHA.YX.Design.Strategy.FightingStrategy [ Abstract ]
{

Method Fighting() [ Abstract ]
{
}

}

Implementación de estrategia específica

Class PHA.YX.Design.Strategy.StrongRivalStrategy Extends (%RegisteredObject, PHA.YX.Design.Strategy.FightingStrategy)
{

Method Fighting()
{
	w "遇到了强大的对象,张无忌使用乾坤大挪移",!
}

}
Class PHA.YX.Design.Strategy.CommonRivalStrategy Extends (%RegisteredObject, PHA.YX.Design.Strategy.FightingStrategy)
{

Method Fighting()
{
	w "遇到了普通的对象,张无忌使用圣火令",!
}

}
Class PHA.YX.Design.Strategy.WeakRivalStrategy Extends (%RegisteredObject, PHA.YX.Design.Strategy.FightingStrategy)
{

Method Fighting()
{
	w "遇到了较弱的对象,张无忌使用太极剑法",!
}

}

Estrategia de contexto

Class PHA.YX.Design.Strategy.Context Extends %RegisteredObject
{

Property mFightingStrategy As PHA.YX.Design.Strategy.FightingStrategy;

Method %OnNew(fightingStrategy As PHA.YX.Design.Strategy.FightingStrategy) As %Status [ Private, ServerOnly = 1 ]
{
	s ..mFightingStrategy=fightingStrategy
	Quit $$$OK
}

Method Fighting()
{
	d ..mFightingStrategy.Fighting()
}

}

Llamar

Class PHA.YX.Design.Program Extends %RegisteredObject
{
/// d ##class(PHA.YX.Design.Program).Strategy() 
ClassMethod Strategy()
{
	#dim context as PHA.YX.Design.Strategy.Context
	s context = ##class(PHA.YX.Design.Strategy.Context).%New(##class(PHA.YX.Design.Strategy.CommonRivalStrategy).%New())
	d context.Fighting()
	s context = ##class(PHA.YX.Design.Strategy.Context).%New(##class(PHA.YX.Design.Strategy.StrongRivalStrategy).%New())
	d context.Fighting()
	s context = ##class(PHA.YX.Design.Strategy.Context).%New(##class(PHA.YX.Design.Strategy.WeakRivalStrategy).%New())
	d context.Fighting()
	q ""
}
}

Salida

DHC-APP>w ##class(PHA.YX.Design.Program).Strategy()
遇到了普通的对象,张无忌使用圣火令
遇到了强大的对象,张无忌使用乾坤大挪移
遇到了较弱的对象,张无忌使用太极剑法
 

Pensando

Los centros comerciales tienen descuentos, 100% de descuento 300, 20% de descuento, cargos normales, 50% de descuento 200, 50% de descuento, 9% de descuento y 9% de descuento Los estudiantes interesados ​​pueden enviarme para referirme a él después de la realización.

30 artículos originales publicados · Me gusta 31 · Visitas 2327

Supongo que te gusta

Origin blog.csdn.net/yaoxin521123/article/details/105446580
Recomendado
Clasificación