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 { ... }

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

相关推荐
lxh0113几秒前
电话号码的字母组合
java·javascript·算法
爱学习的小可爱卢3 分钟前
算法—Java Map 核心方法与实战场景指南
java·开发语言·算法
豆豆4 分钟前
建站系统怎么选?2026年SaaS平台与开源CMS对比分析
java·开发语言·开源·cms·网站建设·网站制作·网站开发
鹓于10 分钟前
PPT VBA随机选题系统实现详解
java·前端·javascript
光泽雨11 分钟前
c#数值类型之间的自动转换
java·算法·c#
云烟成雨TD13 分钟前
Spring AI Alibaba 1.x 系列【17】模型拦截器(ModelInterceptor)
java·人工智能·spring
Flittly15 分钟前
【SpringSecurity新手村系列】(1)初识安全框架
java·spring boot·安全·spring·安全架构
Predestination王瀞潞19 分钟前
Java EE3-我独自整合(第五章:Spring AOP 介绍与入门案例)
java·后端·spring·java-ee
それども23 分钟前
Spring Boot 异常拦截处理机制
java·spring