首页 > 编程语言 > 详细

Unity---游戏设计模式(6)之策略模式

时间:2019-10-15 17:55:41      阅读:72      评论:0      收藏:0      [点我收藏+]



概述参考请看 参考博客

策略模式的功能是把具体的算法实现,从具体的业务处理里面独立出来,把它们实现成为单独的算法类,从而形成一系列的算法,并让这些算法可以相互替换。

1、策略模式

策略模式UML
技术分享图片

策略模式原型代码
假如我们是商家,对于不同的Vip用户要打不同的折扣。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StrategyMode : MonoBehaviour
{
    private void Start()
    {
        double money = 1000f;

        Strategy strategyNormal = new ConcreteStrategy1();
        Strategy strategyVip = new ConcreteStrategy2();
        Strategy strategySuperVip = new ConcreteStrategy3();

        Price priceNormal = new Price(strategyNormal);
        Debug.Log("普通用户花费:" + priceNormal.CalculateMoney(money));

        Price priceVip = new Price(strategyVip);
        Debug.Log("Vip用户花费:" + priceVip.CalculateMoney(money));

        Price priceSuperVip = new Price(strategySuperVip);
        Debug.Log("超级Vip用户花费:" + priceSuperVip.CalculateMoney(money));
    }
}

public class Price
{
    private Strategy mStrategy;

    public Price(Strategy strategy)
    {
        mStrategy = strategy;
    }

    public double CalculateMoney(double money)
    {
        if (mStrategy != null)
        {
            return mStrategy.Calculate(money);
        }
        return -1;
    }
}

public interface Strategy
{
    double Calculate(double money);
}
public class ConcreteStrategy1 : Strategy
{
    public double Calculate(double money)
    {
        Debug.Log("普通用户,不打折。");
        return money;
    }
}
public class ConcreteStrategy2 : Strategy
{
    public double Calculate(double money)
    {
        Debug.Log("Vip用户,打9折。");
        return money * 0.9f;
    }
}
public class ConcreteStrategy3 : Strategy
{
    public double Calculate(double money)
    {
        Debug.Log("超级Vip用户,打8折。");
        return money * 0.8f;
    }
}

2、策略模式例子

在游戏中,游戏中角色等级变化时,许多属性也会变化。在写属性的变化算法上,就可以用到策略模式去计算值的变化。

/// <summary>
/// 策略模式
/// 计算当角色等级增加时,属性的提升
/// </summary>
public interface IAttributeStrategy
{
    int GetExtraHPValue(int lv);

    int GetExtraAttackValue(int lv);
}

/// <summary>
/// 战士属性
/// </summary>
public class SoldierAttributeStrategy : IAttributeStrategy
{
    public int GetExtraHPValue(int lv)
    {
        //每级增加10血量
        return (lv - 1) * 10;
    }

    public int GetExtraAttackValue(int lv)
    {
        //每级增加2攻击力
        return (lv - 1) * 2;
    }
}
/// <summary>
/// 敌人属性
/// </summary>
public class EnemyAttributeStrategy : IAttributeStrategy
{
    public int GetExtraHPValue(int lv)
    {
        //每级增加15血量
        return (lv - 1) * 15;
    }

    public int GetExtraAttackValue(int lv)
    {
        //每级增加3攻击力
        return (lv - 1) * 3;
    }
}

当角色升级时,就可以根据策略模式获取需要增加的属性值。

3、策略模式优缺点

优点

  1. 扩展性好。
  2. 避免多重条件语句。

缺点

  1. 对象数目较多。
  2. 客户端必须知道所有的策略类,并自行决定使用哪一种。

Unity---游戏设计模式(6)之策略模式

原文:https://www.cnblogs.com/Fflyqaq/p/11679066.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!