依赖倒置原则
如果说实现开闭原则的关键事抽象化,是面向对象设计的目标的话,依赖倒置原则就是这个面向对象设计的主要机制。
定义 :
抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。
为什么要实现倒置?这也是我们看这个定义的时候产生的一些问题,那么我们就来说说。
简单的来说,传统的过程性系统的设计办法倾向于使高层次的模块依赖于低层次的模块,抽象层依赖于具体层次,倒置原则是要把这个错误的依赖关系倒转过来,这就是依赖倒置原则的由来。也是为什么要进行依赖倒置。
依赖倒置原则的实现方法
依赖倒置原则的目的是通过要面向接口的编程来降低类间的耦合性,所以我们在实际编程中只要遵循以下4点,就能在项目中满足这个规则:
每个类尽量提供接口或抽象类,或者两者都具备。
变量的声明类型尽量是接口或者是抽象类。
任何类都不应该从具体类派生。
使用继承时尽量遵循里氏替换原则。
下面我们通过一些代码实例(商品售卖)来进行理解:
class BeijingShop implements Shop{
public String sell(){
return "北京商店售卖:北京烤鸭,稻香村月饼";
}
}
class ShanDongShop implements Shop{
@Override
public String sell() {
return "山东商店售卖:德州扒鸡,烟台苹果";
}
}
//如果说顾客去购买商品
class Customer{
public void shopping(ShanDongShop shop){
//购物
System.out.println(shop.sell());
}
}
//这是在山东商店购买,如果说是在北京商店购买就会这样
class Customer{
public void shopping(BeijingShop shop) {
//购物
System.out.println(shop.sell());
}
}
这也是这种设计的存在缺陷,顾客每更换一家商店,都要修改一次代码,这明显违背了开闭原则。存在以上缺点的原因是:顾客类设计时同具体的商店类绑定了,这违背了依赖倒置原则。解决方式我们可以定义一个共同的接口Shop,就可以这样了。
public class TestSale {
public static void main(String[] args) {
Customer c = new Customer();
System.out.println("---顾客购买商品如下---");
c.shopping(new ShanDongShop());
c.shopping(new BeijingShop());
}
}
interface Shop{
//售卖方法
public String sell();
}
class BeijingShop implements Shop{
public String sell(){
return "北京商店售卖:北京烤鸭,稻香村月饼";
}
}
class ShanDongShop implements Shop{
@Override
public String sell() {
return "山东商店售卖:德州扒鸡,烟台苹果";
}
}
class Customer{
public void shopping(Shop shop) {
System.out.println(shop.sell());//购物
}
}
程序运行结果
本文地址:网络百科频道 https://www.eeeoo.cn/wangluo/903083_3.html,嗨游网一个专业手游免费下载攻略知识分享平台,本站部分内容来自网络分享,不对内容负责,如有涉及到您的权益,请联系我们删除,谢谢!