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
- Encapsula uma série de algoritmos e podem substituir uns aos outros
- Resolva o problema de usar vários julgamentos de condições
- 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.
- Objetivo : definir uma série de algoritmos, encapsulá-los um por um e torná-los intercambiáveis.
- A solução principal : quando existem vários algoritmos semelhantes, o uso de if ... else é complicado e difícil de manter.
- Quando usar : um sistema tem muitas, muitas classes, e o que as distingue é seu comportamento direto.
- Como resolver : Encapsule esses algoritmos em classes, um por um, e substitua-os arbitrariamente.
- Código-chave : implemente a mesma interface.
- Melhoria : pode cooperar com o modo de fábrica para criar instância de Contexto