面向对象设计原则详解:依赖倒置原则

定义:抽象不应该依赖于细节。细节应该依赖于抽象。程序中所有的依赖关系都应该终止于抽象类和接口。针对接口而非实现编程。任何变量都不应该持有一个指向具体类的指针或引用。任何类都不应该从具体类派生。任何方法都不应该覆写他的任何基类中的已经实现了的方法。
    说通俗一点就是,你抽象了一个类,这个类在这个工程中可以用,如果再做一个工程,移植过来还能用。遵循这一目的是为了代码的复用。不过这一条规则我觉得原则上可以遵守,但是不一定非要遵守。除非你确定目前的工程,在后续的新工程中需要复用。比如说,开发手机的系统,一般情况下后续多个型号都是以第一个开发出的那个系统为基础的。模块移植很多,这种情况下必须考虑依赖倒置原则。但是如果你正在做的工程,你很清楚这个工程,后面的开发不会再用目前的代码了,比如,下一个版本的软件要换另一种语言开发,那就没必要非得遵守这个原则了。
    如何遵守依赖倒置原则呢?
    1、通过构造函数或者方法传递依赖对象;
    2、通过set方法传递依赖对象;
    3、接口声明实现依赖对象。
    结合以上三条,看下面的例子。
    例如,一个程序员开始写代码。
[csharp]  view plain copy print ?
  1. public class CSharp  
  2. {  
  3.     public void Coding()  
  4.     {  
  5.         Console.WriteLine("使用C#开始写代码。");  
  6.     }  
  7. }  
  8. public class Programer  
  9. {  
  10.     private string name;  
  11.   
  12.     public Programer(string name)  
  13.     {  
  14.         this.name = name;  
  15.     }  
  16.   
  17.     public void Coding(CSharp csharp)  
  18.     {  
  19.         Console.Write(name);  
  20.   
  21.         csharp.Coding();  
  22.     }  
  23. }  

调用

[csharp]  view plain copy print ?
  1. static void Main(string[] args)  
  2. {  
  3.    Programer programer = new Programer("小白");  
  4.   
  5.    programer.Coding(new CSharp());  
  6.   
  7.    Console.ReadLine();  
  8. }  

输出:

小白使用C#开始写代码。

可是这样programer只会用C#,这不行的,要多学几门编程语言。c#只是一门编程语言,抽象一下。

[csharp]  view plain copy print ?
  1. public abstract class ProgramLangvage  
  2. {  
  3.      public abstract void Coding();  
  4. }  
  5.   
  6. public class CSharp:ProgramLangvage  
  7. {  
  8.   
  9.     public override void Coding()  
  10.     {  
  11.         Console.WriteLine("使用C#开始写代码。");  
  12.     }  
  13. }  
  14.   
  15. public class Java : ProgramLangvage  
  16. {  
  17.   
  18.     public override void Coding()  
  19.     {  
  20.         Console.WriteLine("使用Java开始写代码。");  
  21.     }  
  22. }  
  23.   
  24. public class Programer  
  25. {  
  26.     private string name;  
  27.   
  28.     public Programer(string name)  
  29.     {  
  30.         this.name = name;  
  31.     }  
  32.   
  33.     public void Coding(ProgramLangvage programLnagvage)  
  34.     {  
  35.         Console.Write(name);  
  36.   
  37.         programLnagvage.Coding();  
  38.     }  
  39. }  

 调用

[csharp]  view plain copy print ?
  1. class Program  
  2.   
  3.    static void Main(string[] args)  
  4.    {  
  5.        Programer programer = new Programer("小白");  
  6.   
  7.        programer.Coding(new CSharp());  
  8.   
  9.        programer.Coding(new Java());  
  10.   
  11.        Console.ReadLine();  
  12.    }  

 输出:
 小白使用C#开始写代码。
 小白使用Java开始写代码。
 这样Programer和ProgramLangvage结合,就达到了复用的目的,在其他工程中,只需对ProgramLangvage实现不同就可以了,调用programer.Coding的地方基本不用修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值