走向面向对象的六大原则--依赖倒置原则

面向对象编程的六大原则


让项目拥有变化的能力--依赖倒置原则
依赖倒置原则的英文全程是Dependence Inversion Principle,缩写是DIP,依赖倒置原则是一种特定的解耦形式,使得高层次的模块不依赖于低层次的模块的实现细节的目的,依赖模块被颠倒了。简单的说有以下几点:

  • 高层模块不应该依赖于底层模块,两者都应该依赖于其抽象。
  • 抽象不应该依赖于细节。
  • 细节应该依赖于抽象。

在Java语言中,抽象就是指接口和抽象类,两者都是不能直接被实例化的;细节就是指实现类,实现接口或继承抽象类而产生的类就是细节,细节可以被直接实例化。高层模块是指调用端,低层模块就是具体实现类。依赖倒置原则在Java中的表现就是:模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或者抽象类产生的。

在我们之前的章节中,有一章的ImageLoader是依赖于具体实现的,代码如下:

public class ImageLoader {
    // 内存缓存(直接依赖于细节)
    MemoryCache mMemoryCache  = new MemoryCache ();
    // 线程池,线程数为CPU所允许的数量
    ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    //加载图片到ImageView中
    public void displayImg(final String url, final ImageView imageView) {
    }
    //从网络获取图片
    private Bitmap downloadImg(String imageUrl) {
    }

}

然后我们分析出该图片加载类只有内存缓存,已经无法满足我们的需求,于是我们设计出了DoubleCache类,此时便需要修改我们的代码:

public class ImageLoader {
    // 双缓存(直接依赖于细节)
    DoubleCache mDoubleCache   = new DoubleCache ();
    // 线程池,线程数为CPU所允许的数量
    ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    //加载图片到ImageView中
    public void displayImg(final String url, final ImageView imageView) {
    }
    //从网络获取图片
    private Bitmap downloadImg(String imageUrl) {
    }
}

我们将MemoryCache修改为DoubleCache,并且修改了部分缓存代码,就轻松地满足了我们的需求。但是!这里就违反了我们第二章所讲的开闭原则,这样设计出来的代码在后期需求改变时需要不停地修改,会使代码冗余并且容易出错。我们在开闭原则一章结束时的代码就很好地解决了这个问题,一句话概括起来就是:依赖抽象,而不依赖于具体实现。通过依赖注入的方式,可以保证系统的灵活性,我们回顾一下之前的代码(不熟悉的同学请回头阅读开闭原则:

ImageCache抽象类

public interface ImageCache {
    Bitmap get(String url);

    void put(String url,Bitmap bitmap);
}

ImageLoader类

 public class ImageLoader {
    // 图片缓存,依赖于抽象,并且有一个默认的实现
    ImageCache mImageCache = new MemoryCache();

    // 设置缓存策略,依赖于抽象
    public void setmImageCache(ImageCache cache){
        mImageCache = cache;
    }

    public void displayImage(String imageUrl,ImageView imageView){
    }
}

在这里,我们建立了ImageCache抽象,并且让ImageLoader依赖于抽象而不是具体细节。当我们的缓存策略发生改变时,我们只需要实现ImageCache或者集成已有的ImageCache子类完成具体的代码实现即可,这样就保证了我们的软件的高拓展性,有了变化的能力,这就是依赖倒置原则
从上述的几节我们也发现,好像要让系统变得灵活,抽象似乎成了我们唯一的手段。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容