java设计模式学习笔记--依赖倒转原则
依赖倒转原则简述
1.高层模块不应该依赖低层模块,二者都应该依赖其抽象
2.抽象不应该依赖细节,细节应该依赖抽象
3.依赖倒转得中心思想时面向接口编程
4.依赖倒转原则时基于这样得设计理念:相对于细节得多变性,抽象得东西要稳定得多。以抽象为基础搭建的架构比以细节为基础搭建的架构要稳定得多。在java中,抽象指的时接口或是抽象类,细节就是具体得实现类
5.使用接口或抽象类的目的时规定好规范,而不涉及任何具体操作,把展现细节的任务交给他们的实现类完成
依赖倒转原则的三种实现方式
1.接口传递
2.构造方法传递
3.setter方式传递
应用实例
没有使用依赖倒转原则
public class DependecyInversion {
public static void main(String[] args) {
Person p = new Person();
p.receive(new Email());
}
}
/*
* 完成Person接收消息的功能
*方式1分析
*1. 简单,比较容易想到
*2. 如果我们获取的对象是微信,短信等等,则新增类,同时Person类也要增加相应的接受方法
*3.解决思路:引入一个抽象的接口IReceiver,表示接收者,这样Person类 与接口IReceiver发生依赖
*因为Email,微信,等等属于接收的范围,他们各自实现IReceiver接口就ok了,这样我们就符合依赖倒转原则
*/
class Email{
public String getInfo() {
return "电子邮件信息:hello, world";
}
}
class Person{
public void receive(Email email) {
System.out.println(email.getInfo());
}
}
接口传递
public class DependecyInversionTest {
public static void main(String[] args) {
//方法1,通过接口实现
ChangHong changHong = new ChangHong(); //创建ChangHong类的对象
OpenAndClose openAndClose = new OpenAndClose(); //创建OpenAndClose类的对象
openAndClose.open(changHong); //通过接口实现
}
}
//方式1:通过接口传递依赖
interface IOpenAndClose {
public void open(ITV tv);
}
interface ITV {
public void play();
}
class OpenAndClose implements IOpenAndClose{
public void open(ITV tv) {
tv.play();
}
}
class ChangHong implements ITV{
public void play() {
System.out.println("打开");
}
}
构造方法传递
public class DependecyInversionTest {
public static void main(String[] args) {
//方法2,通过构造器实现
ChangHong changHong = new ChangHong(); //创建ChangHong类的对象
OpenAndClose openAndClose= new OpenAndClose(changHong); //创建OpenAndClose类的对象
openAndClose.open(); //通过构造器实现
}
}
//方式2,通过构造方法依赖传递
interface IOpenAndClose {
public void open();
}
interface ITV{
public void play();
}
class OpenAndClose{
public ITV tv;
public OpenAndClose(ITV tv) {
this.tv = tv;
}
public void open() {
this.tv.play();
}
}
class ChangHong implements ITV{
@Override
public void play() {
// TODO Auto-generated method stub
System.out.println("打开");
}
}
setter方式传递
public class DependecyInversionTest {
public static void main(String[] args) {
//方法3,通过setter方式实现
ChangHong changHong = new ChangHong(); //创建ChangHong类的对象
OpenAndClose openAndClose = new OpenAndClose(); //创建ChangHong类的对象
openAndClose.setTV(changHong); //通过setter方式传递
openAndClose.open(); //调用open()方法
}
}
//方式3,通过setter方法传递
interface IOpenAndClose{
public void open();
}
interface ITV{
public void play();
}
class ChangHong implements ITV{
public ITV tv;
public void play() {
System.out.println("打开");
}
}
class OpenAndClose implements IOpenAndClose{
public ITV tv;
public void setTV(ITV tv) {
this.tv = tv;
}
public void open() {
this.tv.play();
}
}
java设计模式学习笔记--依赖倒转原则的更多相关文章
- java设计模式学习笔记--接口隔离原则
接口隔离原则简述 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应建立在最小的接口上 应用场景 如下UML图 类A通过接口Interface1依赖类B,类C通过接口Interface1依赖类 ...
- java设计模式学习笔记--单一职责原则
单一职责原则注意事项和细节 1.降低类的复杂度,一个类只负责一项职责 2.提高可读性,可维护性 3.降低变更引起的风险 4.通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在代码级违反单 ...
- java设计模式学习笔记--开闭原则
基本介绍 1.开闭(ocp)原则时编程中最基础.最重要的设计原则 2.一个软件实体如类.木块和函数应该对扩展开放,对修改关闭.用抽象构建框架,用实现扩展细节.即对提供方开放,对使用方关闭. 3.当软件 ...
- java设计模式学习笔记——里氏替换原则
oo中的继承性的思考和说明 1.继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的子类必须遵循这些七月,但是如果子类对这些已经实现的方法任意修改,就会对 ...
- java设计模式学习笔记--浅谈设计模式
设计模式的目的 编写软件的过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战.设计模式为了让程序具有更好的 1.代码重用性(即:相同功能的代码,不用多次编写) ...
- Java设计模式学习笔记(四) 抽象工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...
- Java设计模式学习笔记(五) 单例模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 使用单例模式的原因 以Windows任务管理器为例,在Windows系统中,任务管理器是唯 ...
- Java设计模式学习笔记(二) 简单工厂模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 正文开始... 1. 简介 简单工厂模式不属于GoF23中设计模式之一,但在软件开发中应用也较为 ...
- Java设计模式学习笔记(三) 工厂方法模式
前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 简介 上一篇博客介绍了简单工厂模式,简单工厂模式存在一个很严重的问题: 就是当系统需要引入 ...
随机推荐
- 前端入门nginx
一.nginx是什么 NGINX is a free, open-source, high-performance HTTP server and reverse proxy, as well as ...
- 一、Shell概述
什么是Shell 解释Shell脚本名词之前,我们先来说下什么是Shell? Shell是一个命令解释器,它在操作系统的最底层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统 ...
- 构建一个学生Student,根据类Student的定义,创建五个该类的对象,输出每个学生的信息,计算并输出这五个学生Java语言成绩的平均值,以及计算并输出他们Java语言成绩的最大值和最小值。
定义一个表示学生信息的类Student,要求如下: (1)类Student的成员变量: sNO 表示学号: sName表示姓名: sSex表示性别: sAge表示年龄: sJava:表示Java课程成 ...
- Asp.net core 2.x/3.x 的 Globalization 和 localization 的使用 (一) 使用方法
由于Api的接口需要返回多语言,因此参考了网上很多篇文章,,有些文章写的太过于理论,看起来比较费劲,今天下午搞了一个下午,总结了一下经验,, 做这个功能时,主要参考了两篇文章: https://blo ...
- python 异常之进阶操作
1.文件分析 下面来做一些文件分析操作,分析整本书的信息. 知识点: string.split():将字符串分解为列表. open(filename,‘rb’)或者open(filename,enco ...
- angularJS 格式化日期 转载
angularjs中的filter(过滤器)——格式化日期的date 标签: filterangularjsdate http://blog.csdn.net/smile_panda/article/ ...
- 如何查看SparkSQL 生成的抽象语法树?
前言 在<Spark SQL内核剖析>书中4.3章节,谈到Catalyst体系中生成的抽象语法树的节点都是以Context来结尾,在ANLTR4以及生成的SqlBaseParser解析SQ ...
- Redis中RDB和AOF持久化区别和联系
RDB和AOF持久化 RDB持久化 RDB是什么? 原理是redis会单独创建(fork) 一个与当前进程一模一 样的子进程来进行持久化,这个子进程的所有数据(变量.环境变量,程序程序计数器等) ...
- 08-SpringMVC02
今日知识 1. 文件上传 2. ResponseBody和RequestBody 3. SpringMVC多视图 4. 静态资源的处理 文件上传 1. 导包,(commom.io , commons- ...
- 08-JavaScript基础
今日知识 1. JavaScript基础 2. 案例 3.总结 JavaScript介绍: * 概念:一门客户端脚本语言 * 运行在客户端浏览器中的,每一个浏览器都有JavaScript的解析引擎 * ...