我不明白依赖倒置与 Gof 书中的著名短语“编程接口,而不是实现”之间的区别。DIP 的定义阐明了以下原则:
- 高级模块不应该依赖于低级模块。两者都应该依赖于抽象。
- 抽象不应依赖于细节。细节应该取决于抽象。
似乎这两个原则都做同样的事情:将接口与实现分离。
我不明白依赖倒置与 Gof 书中的著名短语“编程接口,而不是实现”之间的区别。DIP 的定义阐明了以下原则:
似乎这两个原则都做同样的事情:将接口与实现分离。
在 OOP 的一般意义上,“程序接口,而不是实现”是一个很好的建议(即使您的语言不支持接口的概念)。这个想法是发送消息的对象不应该关心接收者的细节(例如,哪个类是实例或者它是否属于给定的层次结构),只要它可以回答一组消息(并因此执行一组行为)。如果您查看 GoF 中的模式,主要的底线之一是,只要您针对接口进行编程,您就可以用另一个目标对象替换目标对象,而无需更改客户端中的任何内容。
关于依赖倒置原则,我认为它只是前一个想法的具体应用。在分层架构的上下文中,您将编程的想法应用于接口而不是具体的类,目的是将较低层与较高层解耦,以获得灵活性和可重用性。
高温高压
假设您Computer
class
定义如下:
public class Computer
{
public string OwnerName{get; set;}
public int RAMCapacity{get; set;} //Hardware based property
public string OperatingSystem{get; set;} //Software based property
}
现在,编程Interface
说根据上面的代码注释,您应该创建一个ISoftwareComponents
和IHardwareComponents
接口并将这些属性移动到相应的接口并在Computer
类中实现这两个接口,如下所示:
public interface ISoftwareComponents
{
string OperatingSystem{get; set;}
}
public interface IHardwareComponents
{
int RAMCapacity{get; set;}
}
public class Computer : ISoftwareComponent, IHardwareComponents
{
public string OwnerName{get; set;}
public int RAMCapacity{get; set;} //IHardwareComponents property
public string OperatingSystem{get; set;} //ISoftwareComponents property
}
现在Computer
该类的客户端代码可以使用如下代码:
Computer comp = new Computer();
//software requirements can use the below code:
string os = ((ISoftwareComponents)comp).OperatingSystem; // and, other variations by method calls
//hardware requirements can use the below code
int memory = ((IHardwareComponents)comp).RAMCapacity; //and, other variations
您也可以只将计算机的软件和硬件接口部分传递给其他类和方法,如下所示:
public void SetHardware(IHardwareComponents comp)
{
comp.RAMCapacity = 512;
}
更多地探索上述示例,您会了解更多。