【《架构整洁之道》 读书笔记1----从部署的角度看依赖翻转】

2023-05-16

前言

看《架构整洁之道》之前 ,依赖翻转理解: 依赖于抽象,而不是依赖于实现。

抽象:比如水果店Apple、Banana,抽象个水果接口 IFruit,用 IFruit 接口去做一些操作。

正文

抽象出接口,是一种战术操作(具体的操作)。但为什么这么操作呢?
OK,我们从 构建 这个战略层次看下。

内容简述:

  1. 多个组件的循环依赖,导致多个组件实际在部署上是一个组件。
  2. 为了 消除 循环依赖,我们需要依赖变成单向
  3. 依赖变为单向,可以通过依赖翻转实现

循环依赖

  • 如果 Fruit库依赖于 SaleMachine库,SaleMachine库依赖于 Fruite库。(构建版本号指定上)
  • Fruit库升级到v2.0,因为SaleMachie v1.0依赖 Fruit库v1.0。那App需要 v1.0,v2.0 的Fruit库,依赖冲突
  • 为了解决依赖冲突,SaleMachine升级到 v2.0,依赖于 Fruit 库v2.0, 冲突修复。

如上反之亦然,Fruit库和SaleMachine库 在构建、发包角度,已经是一个库了。升级一个,两个都得升级。

// Fruit 库
public interface IFruit {
	double weight;
	double name;
	double unitPrice; //单价
}

public Apple implement IFruit {
import SaleMachine;

void showWeight() {
	double weight = (new WeightMachine().getWeight(this))
	print(weight);
}	
// SaleMachine 库
import IFruit;

public class SaleMachine {
	public void sale(IFruit fruit) {
		int price = fruit.weight * fruit.unitPrice

代码中 Apple这个类 依赖了SaleMachine。
SaleMachine 这个类有依赖了IFruit.

消除循环依赖

抽象出接口,将两个库隔离。主组件(main)负责具体类的注入。

// Fruit 库

/// 苹果店需要的machine
interface IFruitStoreMachine {
	double getWeight(IFruit);
}

public Apple implement IFruit {

void showWeight(IFruitStoreMachine  fruitMachine) {
	weight = (fruittMachine.getWeight(this))
}	
// Machine 库内
interface IGoods {
	String getName();
}

interface IWeightMachine {
	double getWeight(IGoods goods);
}

public calss WightMachine implement IFruitStoreMachine {
	@Override
	double getWeight(IFruit fruit) {
		//...
	}
// Main库
public class FruitMachineAdapter implement IFruitStoreMachine {
		private IWeightMachine weightMachien;

		public FruitMachineAdapter(IWeightMachine weightMachien) {
			this weightMachien  =  weightMachien;
		}

		@Override
		double getWeight(final IFruit fruit) {
			return weightMachien.getWeight(new IGoods() {
					@Override
					String getName() {
						return fruit.name;
					}
			}
		}

}


public class AppleStore {

	public static void main(String[] args) {
		IFruit apple = new Apple();
		apple.showWeight(new FruitMachineAdapter(new WeightMachine()));
	}

Machine库与Fruit 用接口隔离,main组件再通过 Adapter适配器模式(我更喜欢叫 转接头模式),将Machine库的机器 转化为 Fruit库需要的机器接口。

Fruit对Machine库的依赖方向发生了 偏转,由依赖于machine仓库,变为依赖了Fruit内的抽象接口。
而Machine库页断开了依赖。 具体的实现类,在main组件中生成、赋值(也就是配置)

好处

Fruit库、Machine库可以单独 部署、编译、发版

写的不是很好,这篇文章的目的是 抽离于 依赖翻转的实现上,而是从组件 部署的角度去看待这件事。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【《架构整洁之道》 读书笔记1----从部署的角度看依赖翻转】 的相关文章

  • Java Map集合知识点整理(疯狂Java讲义读书笔记)

    JDK文档 http tool oschina net apidocs apidoc api jdk zh Map Map用于保存具有映射关系的数据 因此Map集合里保存着两组值 一组值用于保存Map中的Key值 另一组值用于保存Map中的
  • 逻辑回归分类器

    版权归作者所有 任何形式转载请联系作者 作者 junior 来自豆瓣 来源 https www douban com note 573235939 Logistic的算法实现非常简单 但它背后的逻辑挺复杂的 前天学完很快又忘了 只记得算法怎
  • 《人工智能狂潮》读后感——什么是人工智能?(一)

    从本专栏开始 作者正式研究Python深度学习 神经网络及人工智能相关知识 前一篇文章详细讲解了无监督学习Autoencoder的原理知识 然后用MNIST手写数字案例进行对比实验及聚类分析 本篇文章将分享 人工智能狂潮 书籍内容 包括人工
  • 《Android 开发艺术探索》笔记1--Activity的生命周期和模式

    文章目录 Activity的生命周期和模式思维导图 Activity的生命周期 异常情况下的生命周期 当系统配置发生改变的时候 禁止异常重建Activity Activity的启动模式 Activity的Flags IntentFilter
  • 《拖延心理学》

    一 拖延处理技巧汇编 1 确立一个可操作性的目标 可观察 具体而实在的 而不是那种模糊而抽象的目标 不是 我要停止拖延 而是 我要在9月1日之前打扫和整理我的车库 2 设定一个务实的目标 不要异想天开 而要从小事做起 不要过于理想化 而是要
  • 《淘宝技术这十年》读书笔记 (二).Java时代的脱胎换骨和坚若磐石

    马云说过 一个好的东西往往是是说不清楚的 姑且不论这句话的对与错 但我真的很佩服 淘宝技术这十年 这本书的作者子柳 能够通过淘宝的一些故事 按照时间顺序和IT发展的各种技术描述清楚 而且过程中读起来非常有意思 该读书笔记中参杂了很多原文的知
  • S7协议解析

    S7 1 西门子通信场景 西门子设备使用多种不同现场总线协议 例如 MPI Profibus IE Profinet 等 Profinet用于将PLC连接到IO模块 而不是设备的管理协议 S7以太网通信协议 主要用于将PLC连接到 i pc
  • 富爸爸穷爸爸

    有意思的观点 1 贫穷和破产的区别 破产是暂时的 而贫穷是永久的 2 我们听说过穷人买彩票中奖的故事 他们一下子暴富起来 但不久又变穷了 还有关于职业运动员的故事 有一个运动员在24岁的时候 一年就挣了几百万美元 但到了34岁的时候却露宿桥
  • 【好文鉴赏】初创公司到底值不值得去?从以下几点考虑

    关键词 初创公司 职业发展 就业 原文链接 https tech sina cn csj 2018 09 10 doc ihiixyeu5565677 d html https www zhihu com question 31272586
  • cuda编程学习笔记 第一章 introduction

    准备系统学习cuda知识 这一章基本都懂 记录一下一些细节 global 表示函数在device上 后面永远是void device function is asynchromous cudaDeviceSynchronize waits
  • cuda编程学习笔记 第二章 cuda memory management

    应用的性能可能有 75 都花费在内存相关问题上 NVPROF and NVVP 这俩是调试工具 不知道是不是基于CUPTI CUDA Profiler Tools Interface NVPROF是命令行工具 nvvp是可视化工具 nvvp
  • 【读书笔记】5G与车联网

    5G与车联网 by 李俨 曹一卿 陈书平等人 Quanlcomm Technologies Inc 车联网背景 2015年 麻省理工科技评论 将车车通信评为年度十大突破技术之一 V2V V2X比无人驾驶更容易实现 V2V V2X提供一种超视
  • <稀缺-我们是如何陷入贫穷与忙碌的> 摘要

    2015 07 08 10 12 lt 稀缺 我们是如何陷入贫穷与忙碌的 gt 摘要 这本书分析了稀缺的内在来源和所造成的影响 列举了许多例子 下面我把它的核心思想记录一下 稀缺心态是一切稀缺的根源 资源稀缺并不可怕 就怕有稀缺心态 以后简
  • 做你自己

    2017 03 06 2017 03 10将彼得 巴菲特的书籍 做你自己 个股神巴菲特送给儿子的人生礼物 读完了 感受颇深 沃伦 巴菲特的名言 出生时嘴里含着的金汤匙 最后可能会变成扎在背上的金匕首 考虑不周的赠与会浇灭一个人的雄心并枯竭他
  • 【读书笔记】Linux高性能服务器编程(第二篇 第五章)

    第五章 Linux网络编程基础API 5 1 socket地址API 5 1 1 主机字节序和网络字节序 字节序分为 1 大端字节序 一个整数的高位字节 23 31 bit 存储在内存的低地址处 低位字节 0 7 bit 存储在内存的高地址
  • 软件开发十本书

    几年前 总结了 软件测试十本书 对从事软件质量验证和确认工作的基础知识进行简介 软件花钱最多 耗时最长 投入人力和精力最大的 是在开发过程 根据个人经验 推荐软件开发相关的十本书 供入门和进阶参考 坐等拍砖员 1 代码大全 软件开发世界的
  • 突破人生的瓶颈(心灵之灯)

    人生 四度 平时除了看新闻外我很少看电视 但是那天除外 那天晚上写完稿子 随意打开了一个频道 是央视三套的艺术人生 为何庆魁加油 我不喜欢主持人以煽情的方式 不停发掘主人公内心伤痛泪水的惯用风格 本想换台 考虑到剧作家何庆魁今年来家庭遇到的
  • 《疯狂Java讲义》读书笔记(一)

    面向对象具有三个基本特征 封装 Encapsulation 继承 Inheritance 和多态 Polymorphism 继承是面向对象实现软件复用的重要手段 当子类继承父类 子类作为一个特殊的父类 将获得父类所有的属性和方法 封装是指将
  • 【华为数据之道学习笔记】5-6非结构化数据入湖

    1 非结构化数据管理的范围 非结构化数据包括无格式的文本 各类格式的文档 图像 音频 视频等多样异构的格式文件 相较于结构化数据 非结构化数据更难以标准化和理解 因而非结构化数据的管理不仅包括文件本身 而且包括对文件的描述属性 也就是非结构
  • 工业数据的特殊性和安全防护体系探索思考

    随着工业互联网的发展 工业企业在生产运营管理过程中会产生各式各样数据 主要有研发设计数据 用户数据 生产运营数据 物流供应链数据等等 这样就形成了工业大数据 这些数据需要依赖企业的网络环境和应用系统进行内外部流通才能实现价值挖掘 如何高效安

随机推荐