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

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

相关推荐
小bo波7 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
nanxun8861 天前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103511 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师1 天前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师2 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_02 天前
mac(m5)平台编译openjdk
java
唐青枫3 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马3 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261353 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261353 天前
Java 打印 Word 文档:从基础打印到高级设置
java