设计模式六大原则--依赖倒转原则

简介:

       背景

       前段时间有同学感觉自己电脑内存不够用了想买个内存条,只看她在网上捣鼓了一会就搞定了。也没见她看内存条的具体型号是否可以在其电脑上使用等等知识。一时不得其解,网上查了查才知道电脑的硬件是面向接口设计的,最近正好在学习设计模式,我想这是不是和设计模式中的依赖倒转原则有点关系。下面就让小生带领大家详细了解一下“依赖倒转原则(Dependence Inversion Principle)”吧。

       定义

       1、高层模块不应该依赖底层模块,两者都应该依赖抽象。

       2、抽象不应该依赖于细节,细节应该依赖于抽象。

       (原意:High level modules should not dependupon low level modules. Both should depend upon abstractions. Abstractionsshould not depend upon details. Details should depend upon abstractions)

       详细说明

       依赖倒转其实可以说是面向对象设计的标志,用那种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程。

       示例

       假设我们有一个上层类Manager和底层类Worker。我们需要在程序中添加一个新模块,为此我们创建一个新的类SuperWorker。

       我们假设Manager是一个包含非常复杂的逻辑的类,现在引入新的SuperWorker,我们需要修改它。这样Manager类中一些现有功能可能受到影响,我们需要重新做单元测试,和其他一系列的问题。

所有的问题我们需要用大量的时间去解决,但是如果程序的设计符合依赖倒转原则将会非常简单。我们可以设计一个接口IWorker,让Worker类去实现它。当需要添加SuperWorker类时,我们只需要让它实现IWorker接口即可,这样就避免了Manger类的改动。

       下面是不符合依赖倒转原则的代码。

 //Dependency Inversion Priciple-Bad example
    class Worker
    {
        public void Work()
        {
            //......working
        }       
    }

    class Manager
    {
        Worker worker = new Worker();

        public void SetWorker(Worker w)
        {
            worker = w;
        }

        public void Manage()
        {
            worker.Work();
        }
    }

    class SuperWorker
    {
        public void Work()
        {
            //......working much more
        }
    }

       下面是支持依赖倒转原则的代码。增加一个新的抽象层IWork接口。使得增添SuperWorker累世不需要修改Manager类使其对Manager类现有功能的影响最小化。

//Dependency Inversion Priciple-Good example
    interface IWorker
    {
        public void Work();
    }
    class Worker:IWorker 
    {
        public void Work()
        {
            //......working
        }       
    }


    class SuperWorker : IWorker
    {
        public void Work()
        {
            //......working much more
        }
    }


    class Manager
    {
        Worker worker = new Worker();


        public void SetWorker(Worker w)
        {
            worker = w;
        }


        public void Manage()
        {
            worker.Work();
        }
    }

(实例来源:http://zjliu.iteye.com/blog/423221#,与此同时设计模式中大量的用到了这个原则,想深入研究的朋友可以了解一下)

       优点

       采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,减少并行开发引起的风险,提高代码的可读性和可维护性。



目录
相关文章
|
3月前
|
设计模式
设计模式七大原则
这篇文章介绍了设计模式中的七大原则,特别强调了单一职责原则,即一个类应该只有一个引起其行为变化的原因,以确保类功能的高内聚和低耦合。
|
3月前
|
设计模式 存储 前端开发
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
React开发设计模式及原则概念问题之自定义Hooks的作用是什么,自定义Hooks设计时要遵循什么原则呢
|
2月前
|
设计模式 Java 关系型数据库
设计模式——设计模式简介和七大原则
设计模式的目的和核心原则、单一职责原则、接口隔离原则、依赖倒转原则、里氏替换原则、开闭原则、迪米特法则、合成复用原则
设计模式——设计模式简介和七大原则
|
3月前
|
设计模式 算法 开发者
设计模式问题之最小知识原则(迪米特法则)对代码设计有何影响,如何解决
设计模式问题之最小知识原则(迪米特法则)对代码设计有何影响,如何解决
|
3月前
|
设计模式 前端开发 JavaScript
React开发设计模式及原则概念问题之什么是HOC(Higher-order component),HOC遵循的设计原则都有哪些
React开发设计模式及原则概念问题之什么是HOC(Higher-order component),HOC遵循的设计原则都有哪些
|
3月前
|
设计模式 前端开发 JavaScript
React开发设计模式及原则概念问题之什么是设计模式,单一职责原则如何理解
React开发设计模式及原则概念问题之什么是设计模式,单一职责原则如何理解
|
5月前
|
设计模式 uml
设计模式学习心得之前置知识 UML图看法与六大原则(下)
设计模式学习心得之前置知识 UML图看法与六大原则(下)
37 2
|
5月前
|
设计模式 Java 数据库
深入理解设计模式六大原则
深入理解设计模式六大原则
|
5月前
|
设计模式 数据可视化 程序员
设计模式学习心得之前置知识 UML图看法与六大原则(上)
设计模式学习心得之前置知识 UML图看法与六大原则(上)
42 0
|
6天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式