4.Unity面向对象-接口隔离原则

接口隔离原则(ISP)指出no client should be forced to depend on methods it does not use(不应强迫任何客户端依赖它不使用的方法)。

换句话说,避免大接口。遵循与单一职责原则相同的想法,即保持类和方法简短。这为你提供了最大的灵活性,保持接口紧凑和聚焦。

想象你正在制作一个具有不同玩家单位的策略游戏。每个单位有不同的属性,如生命值和速度。你可能想要一个接口来保证所有单位实现类似的功能:

复制代码
public interface IUnitStats
{
    public float Health { get; set; }
    public int Defense { get; set; }
    public void Die();
    public void TakeDamage();
    public void RestoreHealth();
    public float MoveSpeed { get; set; }
    public float Acceleration { get; set; }
    public void GoForward();
    public void Reverse();
    public void TurnLeft();
    public void TurnRight();
    public int Strength { get; set; }
    public int Dexterity { get; set; }
    public int Endurance { get; set; }
}

假设你想制作一个可破坏的道具,如可击碎的桶或箱子。这个道具也需要生命值的概念,尽管它不会移动。桶或桶也不会具有游戏中其他单位的许多能力。

将其拆分成几个较小的接口,而不是创建一个给可破坏道具太多方法的接口。然后实现它们的类只会混合和匹配它需要的。

将接口拆分成更小的接口。

复制代码
public interface IMovable
{
    public float MoveSpeed { get; set; }
    public float Acceleration { get; set; }
    public void GoForward();
    public void Reverse();
    public void TurnLeft();
    public void TurnRight();
}

public interface IDamageable
{
    public float Health { get; set; }
    public int Defense { get; set; }
    public void Die();
    public void TakeDamage();
    public void RestoreHealth();
}

public interface IUnitStats
{
    public int Strength { get; set; }
    public int Dexterity { get; set; }
    public int Endurance { get; set; }
}

你还可以为爆炸桶添加一个IExplodable接口:

复制代码
public interface IExplodable
{
    public float Mass { get; set; }
    public float ExplosiveForce { get; set; }
    public float FuseDelay { get; set; }
    public void Explode();
}

因为一个类可以实现多个接口,你可以将一个敌人单位由IDamageable、IMovable和IUnitStats组成。一个爆炸桶可以使用IDamageable和IExplodable,而不需要其他接口的不必要开销。

复制代码
public class ExplodingBarrel : MonoBehaviour, IDamageable, IExplodable { ... }
public class EnemyUnit : MonoBehaviour, IDamageable, IMovable, IUnitStats { ... }

再次强调,这优先考虑组合而不是继承,类似于里氏替换原则中的示例。接口隔离原则有助于解耦你的系统,使它们更容易修改和重新部署。

相关推荐
_ZHOURUI_H_3 分钟前
Unity MyFramework 用法说明(二十三):使用 PrefabPoolManager 复用预设实例
unity·游戏引擎·游戏开发·游戏ui·手游开发
城管不管27 分钟前
ReAct、Plan-and-Execute、Reflection 三大智能 Agent 范式核心区别
java·人工智能·算法·spring·ai·动态规划
IT小白杨38 分钟前
从环境制备到自动化工作流:多账号运营的工程化架构拆解
java·经验分享·自动化·安全架构·指纹浏览器
豆瓣鸡1 小时前
算法日记 - Day3
java·开发语言·算法
萧瑟余晖1 小时前
Java深入解析篇九之NIO详解
java·网络·nio
The Chosen One9852 小时前
高进度算法模板速记(待完善)
java·前端·算法
冰凌糕2 小时前
Unity3D Shader 法线与基础光照
unity
极光代码工作室4 小时前
基于SpringBoot的课程预约系统
java·springboot·web开发·后端开发
Leighteen4 小时前
`try-finally` 里的 `return`:为什么 `finally` 会悄悄改掉返回值、吞掉异常
java·开发语言
名字还没想好☜5 小时前
Go 的 time.After 在 select 循环里内存泄漏:定时器堆积原理与 timer.Reset 正确姿势
java·数据库·golang·go·goroutine