重庆企业型网站建设,手机客户端app开发,网站建设杭州缘择低价,一起做网店官网app策略模式#xff08;Strategy Pattern#xff09;是一种行为型设计模式#xff0c;定义了一系列算法#xff0c;并将每种算法封装到独立的类中#xff0c;使得它们可以互相替换。策略模式让算法可以在不影响客户端的情况下独立变化#xff0c;客户端通过与这些策略对象进…策略模式Strategy Pattern是一种行为型设计模式定义了一系列算法并将每种算法封装到独立的类中使得它们可以互相替换。策略模式让算法可以在不影响客户端的情况下独立变化客户端通过与这些策略对象进行交互来执行不同的行为。
在策略模式中核心思想是将算法的定义和使用分离使得不同的策略算法可以灵活地切换符合面向对象设计中的开闭原则即对扩展开放、对修改关闭。
策略模式的结构
策略接口Strategy Interface定义所有策略的共同行为这通常是一个抽象类或接口。具体策略类Concrete Strategy实现策略接口的具体算法。上下文类Context Class维护对某个策略对象的引用并提供对客户端的接口允许客户端调用策略算法。
适用场景
避免使用难以维护的多重条件选择语句当策略中有较为复杂的数据结构或者算法不需要暴露在客户端或者其他时。 在 Unity 中使用 策略模式
在 Unity 中使用策略模式的一个典型应用场景是为游戏角色定义不同的移动方式例如走路、跑步、跳跃等。在游戏开发中不同的角色可能有不同的移动方式。通过策略模式我们可以将这些不同的移动逻辑封装到独立的策略类中并动态切换角色的移动方式。 1、通过策略模式实现角色的移动 (1) 定义策略接口
首先定义一个策略接口 IMoveStrategy它规定所有移动策略都必须实现一个 Move() 方法。
public interface IMoveStrategy
{void Move(Transform characterTransform);
}
(2) 定义具体策略类
创建几个具体的移动策略类 WalkStrategy、RunStrategy 和 JumpStrategy分别实现不同的移动行为。
using UnityEngine;// 走路策略
public class WalkStrategy : IMoveStrategy
{public void Move(Transform characterTransform){characterTransform.Translate(Vector3.forward * 2f * Time.deltaTime);Debug.Log(Character is walking.);}
}// 跑步策略
public class RunStrategy : IMoveStrategy
{public void Move(Transform characterTransform){characterTransform.Translate(Vector3.forward * 5f * Time.deltaTime);Debug.Log(Character is running.);}
}// 跳跃策略
public class JumpStrategy : IMoveStrategy
{public void Move(Transform characterTransform){characterTransform.Translate(Vector3.up * 5f * Time.deltaTime);Debug.Log(Character is jumping.);}
}
(3) 定义上下文类
Character 类作为上下文类负责维护当前的移动策略并提供方法来设置不同的移动策略和执行移动操作。
using UnityEngine;public class Character : MonoBehaviour
{private IMoveStrategy moveStrategy;// 设置移动策略public void SetMoveStrategy(IMoveStrategy strategy){moveStrategy strategy;}// 执行移动public void PerformMove(){if (moveStrategy ! null){moveStrategy.Move(transform);}else{Debug.LogWarning(Move strategy not set!);}}
}
(4) 客户端代码
在 GameController 中我们实例化角色并动态设置和切换移动策略。
using UnityEngine;public class GameController : MonoBehaviour
{private Character character;void Start(){// 创建角色character gameObject.AddComponentCharacter();// 初始化为走路策略character.SetMoveStrategy(new WalkStrategy());}void Update(){// 执行移动character.PerformMove();// 根据输入切换策略if (Input.GetKeyDown(KeyCode.W)){character.SetMoveStrategy(new WalkStrategy());}else if (Input.GetKeyDown(KeyCode.R)){character.SetMoveStrategy(new RunStrategy());}else if (Input.GetKeyDown(KeyCode.Space)){character.SetMoveStrategy(new JumpStrategy());}}
}
示例解释
WalkStrategy角色以较慢的速度向前移动模拟走路的行为。RunStrategy角色以较快的速度向前移动模拟跑步的行为。JumpStrategy角色向上跳跃模拟跳跃的行为。
在 GameController 中使用键盘输入W 键、R 键和空格键来动态切换角色的移动策略。按下相应的键后角色将切换到走路、跑步或跳跃模式。
通过策略模式角色的移动方式可以灵活切换而不需要修改任何核心代码。
策略模式 在 Unity 中的优势是可以动态切换角色行为如移动、攻击等。通过将不同的移动方式封装到独立的类中我们可以更方便地扩展系统并根据游戏需求随时切换策略。 2、通过策略模式实现修改图片的颜色
1定义策略接口
首先定义一个抽象类或接口ChangeColor并且声明一个image参数和ExChangeColor的虚方法
using UnityEngine.UI;
public abstract class ChangeColor
{public Image img;public virtual void ExChangeColor() { }
}2定义具体策略类
然后创建几个具体的策略类ChangeColor和ChangeBlue分别用来改变不同颜色
//修改图片颜色为红色
using UnityEngine;
public class ChangeRed : ChangeColor
{public override void ExChangeColor(){img.color Color.red;}
}-------------------
//修改图片颜色为蓝色
using UnityEngine;
public class ChangeBlue : ChangeColor
{public override void ExChangeColor(){img.color Color.blue;}
}3定义上下文类
维护对strategy 对象的引用并提供方法来设置不同的操作
using UnityEngine.UI;
public class StategyContext
{ChangeColor strategy;public StategyContext(ChangeColor strategy,Image img){this.strategy strategy;this.strategy.img img;}public void StategyContextInterface(){strategy.ExChangeColor();}
}4客户端代码
在 StategyManager 中我们实例化角色并动态设置和切换移动策略。
using UnityEngine.UI;
public class StategyManager : MonoBehaviour
{[SerializeField] private Image img;StategyContext stategyContext;void Update(){if (Input.GetKeyDown(KeyCode.R)){stategyContext new StategyContext(new ChangeRed(), img);stategyContext.StategyContextInterface();}if (Input.GetKeyDown(KeyCode.B)){stategyContext new StategyContext(new ChangeBlue(), img);stategyContext.StategyContextInterface();}}
}今天是2024年12月4日
重复一段毒鸡汤来勉励我和你
你的对手在看书
你的仇人在磨刀
你的闺蜜在减肥
隔壁的老王在练腰
而你在干嘛