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

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

相关推荐
弹简特37 分钟前
【Java项目-企悦抽】15-活动管理模块02-活动创建测试与活动列表实现
java·开发语言·springboot
斯内普吖38 分钟前
(开源)水果蔬菜商城实战指南 基于 Java + SSM + Vue + MySQL
java·vue.js·mysql·开源
wang_shu_mo_ran1 小时前
Spring IoC和DI概念篇
java·后端·spring
淡海水1 小时前
02-01-原理篇-Mark-Sweep与变种算法
算法·unity·c#·游戏引擎·.net·gc
小狼154541 小时前
拼多多订单数据导出 CSV 实战:接口分页、字段平铺与 5 个数据坑,多多开票助手
java·前端·javascript
Joe_Wang51 小时前
【从0到1学习JVM · 25】同样都要停顿所有线程,Parallel比Serial到底强在哪
java·jvm·学习·垃圾回收
wuminyu1 小时前
JVM虚拟线程的底层实现原理分析
java·linux·c语言·jvm·c++
babywang02 小时前
Unity笔记--塔防游戏中的ECS架构:从原理到实战的全面解析
unity·ecs架构
弹简特2 小时前
【Java项目-企悦抽】13-奖品管理模块-奖品列表和创建奖品的实现
java·开发语言·网络·springboot
小蒜学长2 小时前
基于Spring Boot+Vue的“禾源”农产品销售系统设计与实现(代码+数据库+LW)
java·spring boot·后端·农产品销售系统·产品溯源