加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

设计模式六大原则 依赖倒置原则

发布时间:2020-12-13 22:14:41 所属栏目:百科 来源:网络整理
导读:设计模式六大原则(3): 依赖倒置原则 定义: 高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。 所谓依赖倒置原则(Dependence Inversion Principle )就是要依赖于抽象,不要依赖于具体。简单的说就是对抽象进行

设计模式六大原则(3): 依赖倒置原则

定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。

所谓依赖倒置原则(Dependence Inversion Principle )就是要依赖于抽象,不要依赖于具体。简单的说就是对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。

依赖倒置原则的核心思想是面向接口编程。

而面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变化时,上层也要跟着变化,这就会导致模块的复用性降低而且大大提高了开发的成本。

而依赖倒置原则的本质就是通过抽象(抽象类或接口)使各个类或模块的实现彼此独立,不相互影响,实现模块间的松耦合。但是这个原则也是6个设计原则中最难以实现的了,如果没有实现这个原则,那么也就意味着开闭原则(对扩展开发,对修改关闭)也无法实现。

依赖倒置有三种方式来实现

1、通过构造函数传递依赖对象

比如在构造函数中的需要传递的参数是抽象类或接口的方式实现。

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

即在我们设置的setXXX方法中的参数为抽象类或接口,来实现传递依赖对象

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

例如下面的例子

涂涂是个女僧

public class Tutu {  
    //涂涂是个女孩,会煮面  
    public void cook(Noodles noodles)  
    {  
        noodles.eat();  
    }  
}

面条(目前只会煮面)

public class Noodles {  
    //吃面条  
    public void eat()  
    {  
        System.out.println("涂涂吃面条...");  
    }  
} 

涂涂坐在家里吃面(场景类)

public class Home {  
    public static void main(String args[])  
    {  
        Tutu tutu = new Tutu();  
        Noodles food = new Noodles();  
        tutu.cook(food);  
    }  
} 
运行结果:涂涂吃面条...

但是这有个问题,涂涂只会做面条,不可能每次都吃面条吧,天天吃面吃死你,所以在上面的Tutu类中的cook方法中,如果涂涂会做其他吃的,那岂不是更好。于是她向家庭主妇迈进了一步,使用了依赖倒置原则。

也就是涂涂通过学习还可以焖米饭,炒鱿鱼(虽然听着不爽,但是很好吃),京酱肉丝啊等等。要想在代码中实现,就需要实现两个接口:ITutu和IFood

public interface ITutu {  
    //这样就会做很多饭菜了  
    public void cook(IFood food);  
} 

实现类

public class Tutu implements ITutu {  
   
    @Override 
    public void cook(IFood food) {  
        food.eat();  
    }  
   
} 

食物接口

public interface IFood {  
    public void eat();  
} 
这样就为扩展留出了很大的空间,方面扩展其他的类。也不会对细节有变动。以后涂涂想吃什么学一下就可以自己做了

实现面条

public class Noodles implements IFood {  
   
    @Override 
    public void eat() {  
        System.out.println("涂涂吃面条...");  
    }  
}

实现米饭

public class Rice implements IFood {  
   
    @Override 
    public void eat() {  
        System.out.println("涂涂吃米饭(终于吃上米饭了)...");  
    }  
}
场景类:涂涂在家里开吃了,想吃什么直接做就是了

public class Home {  
    public static void main(String args[])  
    {  
        //接口使不能实例化滴  
        ITutu tutu = new Tutu();  
        //实例化米饭,涂涂可以吃米饭了  
        IFood rice = new Rice();  
        //吃面条  
        //IFood noodles = new Noodles();  
        tutu.cook(rice);  
    }  
}

场景类:涂涂在家里开吃了,想吃什么直接做就是了
 public class Home {  
    public static void main(String args[])  
    {  
        //接口使不能实例化滴  
        ITutu tutu = new Tutu();  
        //实例化米饭,涂涂可以吃米饭了  
        IFood rice = new Rice();  
        //吃面条  
        //IFood noodles = new Noodles();  
        tutu.cook(rice);  
    }  
}

这样各个类或模块的实现彼此独立,不互相影响,实现了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读