Aprendizagem do modelo de estratégia e realização de caso de padrões de design

Modo de estratégia

Quando um problema tem muitas soluções e queremos mudar a solução usada em tempo de execução, podemos usar o modo de estratégia para resolvê-lo. Por exemplo, calcular o preço de um carrinho de compras (preço original, desconto, retorno total), modo de viagem (metrô, ônibus, bicicleta)

Recursos

  1. Encapsula uma série de algoritmos e podem substituir uns aos outros
  2. Resolva o problema de usar vários julgamentos de condições
  3. Existe uma interface para padronizar esses algoritmos

alcançar

Em um jogo, um personagem tem três habilidades: A, B e C,

  • Habilidade A: infligir dano de poder de ataque * 150%
  • Habilidade B: Ao causar dano básico, um dano adicional de 100 é adicionado
  • Habilidade C: Ao causar danos, mude o poder de ataque básico de acordo com seu próprio estado—攻击力 *(1 加或减 (-1,3])*150%

Attack.cs

interface Attack
{
	double hurtVal(double baseAttack);
}

BaseHurt.cs

class BaseHurt : Attack
{
	public double hurtVal(double baseAttack)
	{
		return baseAttack * 1.5;
	}
}

ExtraHurt.cs

class ExtraHurt : Attack
{
	private double extraVal;
	public ExtraHurt(double extraVal)
	{
		this.extraVal = extraVal;
	}

	public double hurtVal(double baseAttack)
	{
		return baseAttack * 1.5 + extraVal;
	}
}

StateHurt.cs

class StateHurt : Attack
{
	//增益或减益大于-1
	double stateVal;
	public StateHurt(double stateVal)
	{
		this.stateVal = stateVal;
	}

	public double hurtVal(double baseAttack)
	{
		return baseAttack * (1 + stateVal) * 1.5;
	}
}

AttackContext.cs

class AttackContext
{
	private Attack attack;
	
	public AttackContext(Attack attack)
	{
		this.attack = attack;
	}

	public double getHurtVal(double BaseVal)
	{
		return attack.hurtVal(BaseVal);
	}
}

Program.cs

class Program
{
	static void Main(string[] args)
	{
		//技能A  基础伤害
		AttackContext AC = new AttackContext(new BaseHurt());
		double AHurtVal = AC.getHurtVal(100);
		ole.WriteLine("A技能造成伤害{0}",AHurtVal);

		//B技能  额外伤害
		AttackContext BC = new AttackContext(new ExtraHurt(150));
		Console.WriteLine("B技能伤害{0}",BC.getHurtVal(100));

		//C技能  增益减益伤害
		AttackContext CC = new AttackContext(new StateHurt(1.5));
		Console.WriteLine("C技能伤害{0}",CC.getHurtVal(100));
		Console.ReadKey();
	}
}

Resumindo

  • Vantagens: 1. O algoritmo pode ser alternado livremente. 2. Evite usar vários julgamentos de condição. 3. Boa escalabilidade.
  • Desvantagens: 1. As categorias de estratégia aumentarão. 2. Todas as categorias de estratégia precisam ser expostas.
  1. Objetivo : definir uma série de algoritmos, encapsulá-los um por um e torná-los intercambiáveis.
  2. A solução principal : quando existem vários algoritmos semelhantes, o uso de if ... else é complicado e difícil de manter.
  3. Quando usar : um sistema tem muitas, muitas classes, e o que as distingue é seu comportamento direto.
  4. Como resolver : Encapsule esses algoritmos em classes, um por um, e substitua-os arbitrariamente.
  5. Código-chave : implemente a mesma interface.
  6. Melhoria : pode cooperar com o modo de fábrica para criar instância de Contexto

Acho que você gosta

Origin blog.csdn.net/weixin_36382492/article/details/84839712
Recomendado
Clasificación