1    课程讲解

1.1  定义

1.2  优点

1.3  细节描述

2    代码演练

2.0  代码展示优点

2.1  非面向接口编程

2.2  面向接口编程1  传参

2.3  面向接口编程2  构造函数

2.4  面向接口编程3  set方法

1    课程讲解

1.1  定义

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

1.2  优点

◆优点:降低耦合,提高内聚,增强代码的可维护性。

1.3  细节描述
◆抽象不应该依赖细节;细节应该依赖抽象
◆针对接口编程,不要针对实现编程

每个类尽量实现接口或者抽象类,或者继承抽象类并且实现接口

 

2    代码演练

2.0  代码展示优点

面向接口编程优点:Geely,JavaCourse和PreCourse都不需要动,只扩展其他类和修改test即可

2.1  非面向接口编程

缺点:Test实现依赖于具体实现,对于后续细节频繁的需求变更不适用。

测试类:

package com.geely.design.principle.dependencyinversion;

public class Test {
//v1.1 普通方法调取java类
public static void main(String[] args) {
Geely geely = new Geely();
geely.studyJavaClass();
geely.studyPreClass();
}
}

实体类:

package com.geely.design.principle.dependencyinversion;

public class Geely {
public void studyJavaClass(){
System.out.println("Geely Study Java Lesson");
}
public void studyPreClass(){
System.out.println("Geely Study Pre Lesson");
} }

打印结果:

Geely Study Java Lesson
Geely Study Pre Lesson Process finished with exit code 0

2.2  面向接口编程1  接口方法传参

测试类:

package com.geely.design.principle.dependencyinversion;

public class Test {
//v1.1 普通方法调取java类
/*public static void main(String[] args) {
Geely geely = new Geely();
geely.studyJavaClass();
geely.studyPreClass();
}*/ //v1.2 面向接口编程 传参
public static void main(String[] args) {
Geely geely = new Geely();
geely.studyImoocClass(new JavaCourse());
geely.studyImoocClass(new
PreCourse());
}
}

实体类:

package com.geely.design.principle.dependencyinversion;

public class Geely {
public void studyJavaClass(){
System.out.println("Geely Study Java Lesson");
} public void studyPreClass(){
System.out.println("Geely Study Pre Lesson");
} public void studyImoocClass(Icourse icourse){
icourse.studyClass();
}
}

课程类1:

package com.geely.design.principle.dependencyinversion;

public class JavaCourse implements  Icourse{
@Override
public void studyClass() {
System.out.println("Geely Study Java Lesson");
}
}

课程类2:

package com.geely.design.principle.dependencyinversion;

public class PreCourse implements Icourse{
@Override
public void studyClass() {
System.out.println("Geely Study Pre Lesson2");
}
}

课程接口:

package com.geely.design.principle.dependencyinversion;

public interface Icourse {
void studyClass();
}

打印日志:

Geely Study Java Lesson
Geely Study Pre Lesson2 Process finished with exit code 0

2.3  面向接口编程2  构造函数

测试类:

package com.geely.design.principle.dependencyinversion;

public class Test {
//v1.1 普通方法调取java类
/*public static void main(String[] args) {
Geely geely = new Geely();
geely.studyJavaClass();
geely.studyPreClass();
}*/ //v1.2 面向接口编程 传参
/*public static void main(String[] args) {
Geely geely = new Geely();
geely.studyImoocClass(new JavaCourse());
geely.studyImoocClass(new PreCourse());
}*/ //v1.3 面向接口编程 构造函数
public static void main(String[] args) {
Geely geely = new Geely(new JavaCourse());
geely.studyImoocClass();
}
}

实体类:

package com.geely.design.principle.dependencyinversion;

public class Geely {
Icourse icourse ;
public Geely(Icourse icourse){
this.icourse = icourse;
}
public void studyImoocClass(){
icourse.studyClass();
} }

课程类:

同上

课程接口:

同上

打印日志:

Geely Study Java Lesson

Process finished with exit code 0

2.4  面向接口编程3  set方法

测试类:

package com.geely.design.principle.dependencyinversion;

public class Test {
//v1.1 普通方法调取java类
/*public static void main(String[] args) {
Geely geely = new Geely();
geely.studyJavaClass();
geely.studyPreClass();
}*/ //v1.2 面向接口编程 传参
/*public static void main(String[] args) {
Geely geely = new Geely();
geely.studyImoocClass(new JavaCourse());
geely.studyImoocClass(new PreCourse());
}*/ //v1.3 面向接口编程 构造函数
/*public static void main(String[] args) {
Geely geely = new Geely(new JavaCourse());
geely.studyImoocClass();
}*/ //v1.4 面向接口编程 set方法
public static void main(String[] args) {
Geely geely = new Geely();
geely.setIcourse(new JavaCourse());
geely.studyImoocClass(); geely.setIcourse(new PreCourse());
geely.studyImoocClass();
} }

实体类:

package com.geely.design.principle.dependencyinversion;

public class Geely {
Icourse icourse ; public void setIcourse(Icourse icourse) {
this.icourse = icourse;
}
public void studyImoocClass(){
icourse.studyClass();
} }

打印日志:

Geely Study Java Lesson
Geely Study Pre Lesson3 Process finished with exit code 0

课程类:

同上

课程接口:

同上

设计模式课程 设计模式精讲 3-4 依赖倒置原则讲解+coding的更多相关文章

  1. 设计模式课程 设计模式精讲 3-8 迪米法特原则讲解及Coding

    1 课程讲解 1.1 定义 1.2 特质 1.3 重点 2 代码演练 2.1 反例 2.2 正例 1 课程讲解 1.1 定义 定义:一个对象应该对其他对象保持最少的了解.又叫最少知道原则. 1.2 特 ...

  2. 北风设计模式课程---依赖倒置原则(Dependency Inversion Principle)

    北风设计模式课程---依赖倒置原则(Dependency Inversion Principle) 一.总结 一句话总结: 面向对象技术的根基:依赖倒置原则(Dependency Inversion ...

  3. C#软件设计——小话设计模式原则之:依赖倒置原则DIP

    前言:很久之前就想动笔总结下关于软件设计的一些原则,或者说是设计模式的一些原则,奈何被各种bootstrap组件所吸引,一直抽不开身.群里面有朋友问博主是否改行做前端了,呵呵,其实博主是想做“全战”, ...

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

    下面说法对不对? 父类将算法(逻辑)封装起来,子类实现细节:这个就叫DIP(依赖倒置:Dependency Inversion Principles),模板模式就是这个原则的实现.如果在父类中加一个t ...

  5. 设计模式——依赖倒置原则实例(PHP实现)

    <?php /** * 设计模式--依赖倒置原则实例 * Created by DannyWang * jue.wang@yulore.com * 2015-05-05 */ abstract ...

  6. C++ 设计模式 依赖倒置原则 简单示例

    C++ 设计模式 依赖倒置原则 简单示例 /** * 依赖倒置原则(Dependency Inversion Principle) * 依赖于抽象(接口),不要依赖具体的实现(类),也就是针对接口编程 ...

  7. 《设计模式》-原则三:依赖倒置原则(DIP)

    这几天晚上回来都去玩了!没有坚持学习.真的好惭愧! 非常自责 后面一定要坚持 一气呵成  争取每天学一点,把这个学完. 今天主要是看了一下  设计模式中的 原则三: 依赖倒置原则(DIP) 官方是这样 ...

  8. Java设计模式(2:单一职责原则和依赖倒置原则详解)

    一.单一职责原则 不要存在多于一个导致类变更的原因.简单来说,就是一个Class/Interface/Method只负责一项职责. 这句话最为重要的就是这一段:一个Class/Interface/Me ...

  9. 【设计模式六大原则3】依赖倒置原则(Dependence Inversion Principle)

      定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类 ...

随机推荐

  1. The Reason Why Cosmetic Airless Bottles Are Widely Used

    The contents of the Cosmetic Airless Bottles    can be isolated from the air, to prevent the product ...

  2. Adobe PS

    1. ctrl + Tab  切换视图窗口 2.shift 拖拽图片,将 2 张图片放在一起 3.切换显示方式 /全屏/带有工具栏 快捷键:F 4. 缩小/放大工具 快捷键: alt + 鼠标滑轮 5 ...

  3. Go标准库之Context

    文章引用自   Go标准库Context 在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服 ...

  4. 作业1:使用go搭建一个web-server

    todo1:搭建web-server的原理 todo2:go实现web-server

  5. PHP通过thrift2访问HBASE

    前一段时间需要在网页上显示HBASE查询的结果,考虑用PHP来实现,在网上搜了一下,普遍都是用thrift作为接口来实现的.​ 参考博文:​ http://www.cnblogs.com/scotom ...

  6. kafka集群搭建记录

    本文记录搭建kafka搭建过程. 一.硬件机器介绍 192.168.183.195 master-node 192.168.183.194 data-node1 192.168.183.196 dat ...

  7. 【Vue组件系统】

    目录 全局组件 局部组件 注册 子组件的用法 父子组件的通讯 子父组件的通讯 非父子组件的通讯 混入 插槽 具名插槽 使用组件的注意事项 使用组件实现导航栏 "vue.js既然是框架,那就不 ...

  8. The Preliminary Contest for ICPC Asia Shenyang 2019 C Dawn-K's water (完全背包)

    完全背包为什么要取到M,可以取到2*M嘛,这题需要整取,对于不能整取的背包容量,dp[k]=INF,以及dp[j-water[i].weight]=INF时,dp[j]也不需要更新.如果不整取的话,后 ...

  9. Markdown Learning Notes

    Markdown 教程 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档. Markdown 语言在 2004 由约翰·格鲁伯(英语:John Gruber)创建. ...

  10. 用数组实现 最简 hash线性探测

    package arr; import java.util.Random; /** 模拟线性寻址式hash函数 模拟将1000大小包含50个数字的数组,存入大小为100的数组内(为了方便判断,我们将0 ...