理论学习:
- http://www.uml.org.cn/sjms/201009092.asp
- http://blog.csdn.net/hguisu/article/details/7558249
UML类图:
context:使用策略的类
strategy:策略接口
策略模式与桥接模式是不一样的,策略只是一种计算方式,而不能独立,而桥接模式是两种单独的实例互相使用,像武器都有自己的属性
与状态模式也类似,都有一个拥有着,调用接口方法,(实现不一样),但是策略里面是没有状态变化的
原型实现:
using System;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
public class DM03Strategy:MonoBehaviour
{
void Start()
{
StrategyContext context = new StrategyContext();
context.stragegy = new ConcreteStrategyB(); //可用不同的策略赋值
context.Cal(); //根据不同的策略调用不同的实践
}
}
/// <summary>
/// 策略的拥有者
/// </summary>
public class StrategyContext
{
public IStrategy stragegy;
public void Cal()
{
stragegy.Cal();
}
}
/// <summary>
/// 策略接口
/// </summary>
public interface IStrategy
{
void Cal();
}
public class ConcreteStrategyA : IStrategy
{
public void Cal()
{
Debug.Log("使用A策略计算");
}
}
public class ConcreteStrategyB : IStrategy
{
public void Cal()
{
Debug.Log("使用B策略计算");
}
}
实例:
敌人和战士的攻击策略模式实现:
public interface IAttrStrategy
{
int GetExtraHPValue(int lv); //获取最大血量
int GetDmgDescValue(int lv); //减免伤害 lv:等级
int GetCritDmg( float critRate ); //暴击伤害计算
}
public class EnemyAttrStrategy:IAttrStrategy //敌人计算策略
{
public int GetExtraHPValue(int lv)
{
return 0;
}
public int GetDmgDescValue(int lv)
{
return 0;
}
public int GetCritDmg(float critRate)
{
if (UnityEngine.Random.Range(0, 1f) < critRate)
{
return (int)(10 * UnityEngine.Random.Range(0.5f, 1f));
}
return 0;
}
}
public class SoldierAttrStrategy:IAttrStrategy //战士计算策略
{
public int GetExtraHPValue(int lv)
{
return (lv - 1) * 10;
}
public int GetDmgDescValue(int lv)
{
return (lv - 1) * 5;
}
public int GetCritDmg(float critRate)
{
return 0;
}
}