您的位置:首页 > 其它

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

2015-07-31 10:07 411 查看
定义:抽象不应该依赖于细节。细节应该依赖于抽象。程序中所有的依赖关系都应该终止于抽象类和接口。针对接口而非实现编程。任何变量都不应该持有一个指向具体类的指针或引用。任何类都不应该从具体类派生。任何方法都不应该覆写他的任何基类中的已经实现了的方法。

说通俗一点就是,你抽象了一个类,这个类在这个工程中可以用,如果再做一个工程,移植过来还能用。遵循这一目的是为了代码的复用。不过这一条规则我觉得原则上可以遵守,但是不一定非要遵守。除非你确定目前的工程,在后续的新工程中需要复用。比如说,开发手机的系统,一般情况下后续多个型号都是以第一个开发出的那个系统为基础的。模块移植很多,这种情况下必须考虑依赖倒置原则。但是如果你正在做的工程,你很清楚这个工程,后面的开发不会再用目前的代码了,比如,下一个版本的软件要换另一种语言开发,那就没必要非得遵守这个原则了。

如何遵守依赖倒置原则呢?

1、通过构造函数或者方法传递依赖对象;

2、通过set方法传递依赖对象;

3、接口声明实现依赖对象。

结合以上三条,看下面的例子。

例如,一个程序员开始写代码。

[csharp] view
plaincopyprint?

public class CSharp

{

public void Coding()

{

Console.WriteLine("使用C#开始写代码。");

}

}

public class Programer

{

private string name;

public Programer(string name)

{

this.name = name;

}

public void Coding(CSharp csharp)

{

Console.Write(name);

csharp.Coding();

}

}

调用

[csharp] view
plaincopyprint?

static void Main(string[] args)

{

Programer programer = new Programer("小白");

programer.Coding(new CSharp());

Console.ReadLine();

}

输出:

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

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

[csharp] view
plaincopyprint?

public abstract class ProgramLangvage

{

public abstract void Coding();

}

public class CSharp:ProgramLangvage

{

public override void Coding()

{

Console.WriteLine("使用C#开始写代码。");

}

}

public class Java : ProgramLangvage

{

public override void Coding()

{

Console.WriteLine("使用Java开始写代码。");

}

}

public class Programer

{

private string name;

public Programer(string name)

{

this.name = name;

}

public void Coding(ProgramLangvage programLnagvage)

{

Console.Write(name);

programLnagvage.Coding();

}

}

调用

[csharp] view
plaincopyprint?

class Program

static void Main(string[] args)

{

Programer programer = new Programer("小白");

programer.Coding(new CSharp());

programer.Coding(new Java());

Console.ReadLine();

}

输出:

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

小白使用Java开始写代码。

这样Programer和ProgramLangvage结合,就达到了复用的目的,在其他工程中,只需对ProgramLangvage实现不同就可以了,调用programer.Coding的地方基本不用修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: