Unity 设计原则-依赖倒置原则(DIP)

  • 定义

    • 1、高层模块不应该依赖底层模块,它们都应该依赖于抽象。
      • 就是业务逻辑(高层模块) 直接调用具体实现类(底层模块),他们两者应该依赖于抽象类或者是父类和接口
    • 2、抽象不应该依赖于细节
      • 抽象类也不应该依赖具体实现类,也就是底层模块
    • 3、细节应该依赖于抽象。
      • 底层模块也该依赖抽象
    • 总体 定义基本就是面向接口编程(Object-Oriented Design, OOD)
    • 理想的每个实现类都应该有接口和抽象类
    • 任何类都不应该去继承具体类
  • 以下一个例子 没用原则之前的 一个某集团日常业务运转示例

public class PimpBusinessFirm
{
    public void Revolve()
    {
        Debug.Log("啦X条公司业务运转中");
    }
}

public class KGBloc

{
    public void BlocRevolve()
    {
        new PimpBusinessFirm().Revolve();
    }
}
public class MainDemo : MonoBehaviour
{
    void Start()
    {
        new KGBloc().BlocRevolve();
    }
}

在这里插入图片描述
以上代码看起来没问题,也符合单一职责,但是很快集团开展了除了啦X条分公司以外的业务,日用品公司业务。

public class CommodityFirm
{
    public void Revolve()
    {
        Debug.Log("日用品公司业务运转中");
    }
}
public class PimpBusinessFirm
{
    public void Revolve()
    {
        Debug.Log("啦X条公司业务运转中");
    }

    
}

public class KGBloc

{
    public void BlocRevolve()
    {
        new PimpBusinessFirm().Revolve();
        new CommodityFirm().Revolve();
    }
}
public class MainDemo : MonoBehaviour
{
    void Start()
    {
        new KGBloc().BlocRevolve();
    }
}

在这里插入图片描述

我们会发现我们得经常修改集团类KGBloc的BlocRevolve函数,模块与模块之间耦合度太高,效率低下,只要需求一变就要大面积重构,在大型项目中 这是很致命的,不像示例三两下重构完成了,说明这样的设计是不合理,这里也违背了开闭原则,要时常修改集团类KGBloc的BlocRevolve函数,理想的是写好了具体类就不需要修改了,现在我们导入依赖倒置原则


public interface IRevolve 
{
    void Revolve();
}
public class CommodityFirm : IRevolve
{
    public void Revolve()
    {
        Debug.Log("日用品公司业务运转中");
    }
}
public class XXXFirm : IRevolve
{
    public void Revolve()
    {
        Debug.Log("XXX公司业务运转中");
    }
}
public class PimpBusinessFirm : IRevolve
{
    public void Revolve()
    {
        Debug.Log("啦X条公司业务运转中");
    }

    
}

public class KGBloc

{
    public void BlocRevolve(IRevolve revolve)
    {
        revolve.Revolve();
    }
}
public class MainDemo : MonoBehaviour
{
    void Start()
    {
        new KGBloc().BlocRevolve(new PimpBusinessFirm());
        new KGBloc().BlocRevolve(new CommodityFirm());
        new KGBloc().BlocRevolve(new XXXFirm());

    }
}

Unity 设计原则-依赖倒置原则(DIP)_第1张图片
可以看到现在不用去修改集团类(KGBloc),增加新的公司只要每个分公司继承IRevolve就可以运转起来了,然而我们会觉得,那不是得频繁的写 new KGBloc().BlocRevolve(XXX分公司);,这时可以借用反射来创建,代码如下:

public interface IRevolve 
{
    void Revolve();
}

public class PimpBusinessFirm : IRevolve
{
    public void Revolve()
    {
        Debug.Log("啦X条公司业务运转中");
    }

    
}
public class CommodityFirm : IRevolve
{
    public void Revolve()
    {
        Debug.Log("日用品公司业务运转中");
    }
}

public class XXXFirm : IRevolve
{
    public void Revolve()
    {
        Debug.Log("XXX公司业务运转中");
    }
}
public class KGBloc

{
    public void BlocRevolve(IRevolve revolve)
    {
        revolve.Revolve();
    }
}
public class MainDemo : MonoBehaviour
{
    void Start()
    {
       var FirmsTypes= typeof(IRevolve).Assembly.GetTypes();
        for (int i = 0; i < FirmsTypes.Length; i++)
        {
            if (FirmsTypes[i].GetInterfaces().Contains(typeof(IRevolve)))
            {
                ((IRevolve)System.Activator.CreateInstance(FirmsTypes[i])).Revolve();
            } 
        }
        //new KGBloc().BlocRevolve(new PimpBusinessFirm());
        //new KGBloc().BlocRevolve(new CommodityFirm());
        //new KGBloc().BlocRevolve(new XXXFirm());

    }
}

Unity 设计原则-依赖倒置原则(DIP)_第2张图片
可以看到,现在只要新建继承IRevolve就好了,上例代码会反射所有继承IRevolve 的,当然复杂的项目可能还需要某些配置表或者条件去限制创建。

你可能感兴趣的:(C#基础,unity,依赖倒置原则,游戏引擎)