设计模式课程 设计模式精讲 3-4 依赖倒置原则讲解+coding
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的更多相关文章
- 设计模式课程 设计模式精讲 3-8 迪米法特原则讲解及Coding
1 课程讲解 1.1 定义 1.2 特质 1.3 重点 2 代码演练 2.1 反例 2.2 正例 1 课程讲解 1.1 定义 定义:一个对象应该对其他对象保持最少的了解.又叫最少知道原则. 1.2 特 ...
- 北风设计模式课程---依赖倒置原则(Dependency Inversion Principle)
北风设计模式课程---依赖倒置原则(Dependency Inversion Principle) 一.总结 一句话总结: 面向对象技术的根基:依赖倒置原则(Dependency Inversion ...
- C#软件设计——小话设计模式原则之:依赖倒置原则DIP
前言:很久之前就想动笔总结下关于软件设计的一些原则,或者说是设计模式的一些原则,奈何被各种bootstrap组件所吸引,一直抽不开身.群里面有朋友问博主是否改行做前端了,呵呵,其实博主是想做“全战”, ...
- zt 设计模式六大原则(3):依赖倒置原则
下面说法对不对? 父类将算法(逻辑)封装起来,子类实现细节:这个就叫DIP(依赖倒置:Dependency Inversion Principles),模板模式就是这个原则的实现.如果在父类中加一个t ...
- 设计模式——依赖倒置原则实例(PHP实现)
<?php /** * 设计模式--依赖倒置原则实例 * Created by DannyWang * jue.wang@yulore.com * 2015-05-05 */ abstract ...
- C++ 设计模式 依赖倒置原则 简单示例
C++ 设计模式 依赖倒置原则 简单示例 /** * 依赖倒置原则(Dependency Inversion Principle) * 依赖于抽象(接口),不要依赖具体的实现(类),也就是针对接口编程 ...
- 《设计模式》-原则三:依赖倒置原则(DIP)
这几天晚上回来都去玩了!没有坚持学习.真的好惭愧! 非常自责 后面一定要坚持 一气呵成 争取每天学一点,把这个学完. 今天主要是看了一下 设计模式中的 原则三: 依赖倒置原则(DIP) 官方是这样 ...
- Java设计模式(2:单一职责原则和依赖倒置原则详解)
一.单一职责原则 不要存在多于一个导致类变更的原因.简单来说,就是一个Class/Interface/Method只负责一项职责. 这句话最为重要的就是这一段:一个Class/Interface/Me ...
- 【设计模式六大原则3】依赖倒置原则(Dependence Inversion Principle)
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象. 问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成.这种场景下,类 ...
随机推荐
- binwalk在Windows10和kali_Linux下的安装及使用教程
(一)binwalk简介 binwalk 是用于搜索给定二进制镜像文件以获取嵌入的文件和代码的工具. 具体来说,binwalk是一个固件的分析工具,旨在协助研究人员对固件非分析,提取及逆向工程 ...
- KALI修改密码
许久不用的Kali,某天打开竟忘了密码! 网上的方法颇为简单,遂准备亲自试一下. #光标移动到第二行的“恢复模式”,按E进入[编辑模式] #进入编辑模式,鼠标是不可操作的,用方向键往下面翻 ...
- Java进阶学习(5)之设计原则(下)
框架加数据 把数据的硬编码尽可能解成框架加数据的结构 城堡游戏修改后的代码 Room类 package com.castle; import java.util.HashMap; public cla ...
- QQ发起聊天
QQ推广 网址: http://shang.qq.com/v3/widget.html 一键加群 实例: <a target="_blank" href="//sh ...
- nodejs--wechat模块,微信公共平台自动回复消息接口服务中间件
npm 程序官网 https://www.npmjs.com/package/wechat 别人使用笔记网址 https://blog.csdn.net/golduty2/article/detail ...
- Docker - 命令 - docker volume
概述 docker volume 命令 背景 docker 容器的存储, 通常需要独立于镜像 docker volume 就是负责这块的命令 1. 写在 docker volume 之前 概述 doc ...
- C语言中二维数组如何申请动态分配内存
C语言中二维数组如何申请动态分配内存: 使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小 #include <stdio.h> #include <malloc. ...
- SpringMVC重定向(redirect)传参数,前端EL表达式接受值
由于重定向相当于2次请求,所以无法把参数加在model中传过去.在上面例子中,页面获取不到msg参数.要想获取参数,可以手动拼url,把参数带在后面.Spring 3.1 提供了一个很好用的类:Red ...
- linux下删除文件夹
---恢复内容开始--- 4月份左右接触linux,一直到现在,收获不多,原因是因为我没有足够的努力,其实这段时间以来我也很自责. 今天学习linux进程调度等知识,使用小红帽时,准备删除一个无用的文 ...
- 分布式一致性协议 --- Paxos
问题 Paxos 到底解决什么样的问题,动机是什么 Paxos 流程是怎么样的? Paxos 算法的缺陷是什么 概述 Paxos 是分布式一致性算法,根据少数服从多数的原则多个节点确定某个数值.通过学 ...