精华内容
下载资源
问答
  • 单链表倒置

    2016-07-20 13:52:00
    总结了一些算法之后,把我自己认为好理解的简单方便的算法整理下来,方便以后自己复习。 1.迭代 下面的代码及注释应该很好的解释了头插法来实现单链表倒置的思路。 1 Node* Reverse(Node* node) 2 { 3...

    单链表倒置可以说是面试中提问率最高的题目了。网上有很多单链表倒置的算法,但是实现解释的不是很清晰。总结了一些算法之后,把我自己认为好理解的简单方便的算法整理下来,方便以后自己复习。

     

    1.迭代

    下面的代码及注释应该很好的解释了头插法来实现单链表倒置的思路。

     1 Node* Reverse(Node* node)  
     2 {  
     3     Node* prev = NULL;        // 用于保存当前链表的头结点
     4     Node* tmp = NULL;         // 用于保存当前节点的next
     5     while (node != NULL)
     6     {
     7         tmp = node->_next;    // 保存当前节点的next
     8 
     9         node->_next = prev;   // 将当前节点插入到头结点前
    10         prev = node;          // 插入之后将当前节点设置为头节点
    11 
    12         node = tmp;           // next为下次迭代的当前节点
    13     }
    14     return prev;              // 循环结束后,p即为倒置后的头结点
    15 }  

     

    2.递归

    递归来实现倒置最直接的描述就是入栈出栈,链表节点从头结点开始依次入栈,最后到尾节点入栈结束;开始出栈:尾节点最先出栈,出栈时依次将两个相邻的节点交换指向;出栈结束后,整个链表的倒置就完成了。重要的地方是将最先出栈的尾节点返回,这就是倒置后的链表的头结点。

     1 Node* Reverse_recursive(Node* node)
     2 {
     3     // 停止条件
     4     if (node->_next == NULL)
     5         return node;            // 表示到最后一个节点,返回这个节点当作头结点
     6 
     7     // 递归
     8     Node* prev = Reverse_recursive(node->_next);
     9 
    10     // 操作
    11     Node* tmp = node->_next;    // 保存当前节点next
    12     tmp->_next = node;          // 将当前节点放到其next之后
    13     node->_next = NULL;         // 将当前节点的next置为NULL
    14 
    15     return prev;
    16 }

     

    转载于:https://www.cnblogs.com/Ray1024/p/5687737.html

    展开全文
  • 毫不夸张的说,不理解《依赖倒置》的程序员只能写功能,没法写出框架来,也很难再往上提升自己的层次了。为什么这么说?且细看下文!一、如果不进行依赖倒置会怎样? 我们先看看什么是依赖倒置,教科书式的解释就是...

    前言:为什么要用整篇文章来写好像跟领域模型干系不大的《依赖倒置》呢?因为《依赖倒置》是六边形架构的核心!毫不夸张的说,不理解《依赖倒置》的程序员只能写功能,没法写出框架来,也很难再往上提升自己的层次了。为什么这么说?且细看下文!

    一、如果不进行依赖倒置会怎样?

    我们先看看什么是依赖倒置,教科书式的解释就是:

    • 高层模块不应依赖于低层模块,二者应依赖于抽象。
    • 抽象不应依赖于细节,细节应依赖于抽象。

    我们商品领域服务需要使用Repository来持久化数据,中二代码写成这样:

    代码示例

    1.资源库实现具体功能b6cb12e2db10b4f3990d739d58be136a.png

    资源库的实现

    2.领域模型依赖资源库的实现

    b3968061bc860c70addfa731d58f8825.png直接依赖repository

    3.领域模型直接使用资源库实现

    ade2419e5a0afbf80b6b02288a24b349.png使用repository的实现

    这样做的缺点是什么?

    1. 难以维护内部(领域模型)通常是业务逻辑和策略,这里就是DDD里面的领域模型,一个软件区别于其他软件的核心就在于业务逻辑和策略实现(也就是领域模型),而外部更多的是外部资源等基础设施。PS:内部外部概念可参考前文---《Golang领域模型-六边形架构》

    如果领域模型依赖外部资源库,那就是业务逻辑依赖技术细节,技术细节的改变将会对业务逻辑产生影响,使其不得不改变。这样是不合理的。

    2. 复用困难 

    越核心的领域模型,复用价值越高,如果对外部进行依赖,那么复用将会变得很困难。而且违背了六边形的内部倒置外部的原则。

    二、如何进行依赖倒置?

    计算机科学中的所有问题都可以通过引入一个间接层得到解决。

    All problems in computer science can be solved by another level of indirection 

    —— David Wheeler

    实现:domain中引入dependency包定义抽象层

    a2f1c57f3fcda94e8f7c51a655a82279.pngdependency抽象层

    代码示例:

    1.定义了商品仓储实现所需要满足的接口。

    de743daa3d27979e35b71b4318205346.png抽象层

    2.商品领域服务成员变量直接引用抽象接口,框架负责依赖注入

    56e2c1ae342f3e425be0760f7e1847f3.png
    领域模型依赖抽象
    3.商品领域服务中使用抽象出来的GoodsRepo方法
    6a17616c3624d60307b052cad01d1f0f.png
    领域模型依赖抽象
    4.外部资源库具体实现抽象接口
    a7bb2796b84898825ac193c77ad89a45.png外部资源具体实现抽象接口

    注意: var _ dependency.GoodsRepo = new(Goods) 我们用来检查是否实现了接口

    三、六边形架构核心-依赖倒置

    前面讲完基础,现在开始上大戏了!

    为什么说六边形架构的核心是依赖倒置?

    因为六边形架构不分高低层,而分内外部,严格的将基础设施和领域模型分割开来。领域模型实现很简单,但是将领域模型与DB,Redis,MQ等基础设施连接起来却很困难。

    如何连接?依赖倒置!

    1. main函数中安装基础设施kafka
    c4a526985ac2c6e4a6903c68f8dab957.png
    安装kafka
    1. 实体中抽象领域事件接口
    e6982a58e88e8207a6a5419690ee12a4.png
    抽象领域事件接口
    1. kafka的producer实现领域事件接口
    4542667bb193cdc0f893ceecede43487.png
    实现领域事件接口
    1. 订单实体发送领域事件
    cb6fe934d3f367c858d7e47003dc20d9.png
    发送领域事件

    依赖倒置的变与不变

    通过第一、二小结概念的理解,观察第三小结的代码。

    Kafka是个优秀的消息队列中间件,它虽然很好,但只是基础设施,不是系统的核心部分,也许不久的某一天我们就会把它替换掉,对!换成RocketMQ,立刻!马上!

    如果没有依赖倒置怎么办?

    修改业务代码?将所有用到过kafka的地方全部重新写一遍?下次有变化继续写?程序员听了想打人!

    有了依赖倒置怎么办?

    1. 新的中间件只需要实现领域事件接口。
    2. 在main中重新安装。

    这就是依赖倒置的魅力,没有什么是不变的,重要的是将领域模型与基础设施解耦开来。这样替换只需要重写领域事件,让领域模型保持相对稳定,不会随着基础设施的变化而被动变化。

    四、品一品

    细品以上两种代码,第二种实现方式中,领域模型没有像原来一样直接依赖外部资源,而是将依赖关系“倒置”过来,让基础设施去依赖由领域模型定义好的接口。

    回前言所问,为什么要用一篇文章来解释依赖倒置,这就是六边形的核心,外部依赖内部,内部倒置基础设施---freedom!

    总结一下:

    常用的实现方式是基础设施有自己的接口,领域模型依赖基础设施提供的接口,比如基础设施有自己的接口,领域模型依赖基础设施的接口,这样直接依赖的实现方式。

    但是按照依赖倒置的原则,接口的所有权是被倒置的,表现在于接口是领域模型的,领域模型拥有接口的所有权,基础设施实现接口。这样基础设施的改动不会影响领域模型,领域模型的复用不会依赖基础设施。

    1.依赖于构建出来的抽象,而不是具体类。

    2.依赖倒置的关键是接口所有权的倒置。

    目录

    • golang领域模型-开篇
    • golang领域模型-六边形架构
    • golang领域模型-实体
    • golang领域模型-资源库
    • golang领域模型-依赖倒置
    • golang领域模型-聚合根
    • golang领域模型-CQRS
    • golang领域模型-领域事件

    项目代码 https://github.com/8treenet/freedom/tree/master/example/fshop

    PS:关注公众号《从菜鸟到大佬》,发送消息“加群”或“领域模型”,加入DDD交流群,一起切磋DDD与代码的艺术!

    展开全文
  • 依赖倒置

    2018-09-27 16:34:03
    最开始皇帝想找女人的话,就自己去找,狠危险,狠费心——这叫正置。 现在有另外的办法,皇帝招工,招了一堆太监,帮他做各种事,当然包括专门从全国各地给他招女人,而且通过各种工序,层层筛选的,极其安全,找好...

    最开始皇帝想找女人的话,就自己去找,狠危险,狠费心——这叫正置。

    现在有另外的办法,皇帝招工,招了一堆太监,帮他做各种事,当然包括专门从全国各地给他招女人,而且通过各种工序,层层筛选的,极其安全,找好之后给皇帝送到手里。——这叫依赖倒置。

    那么现在这个太监,就是IOC容器,美女是需要皇帝需要的对象,皇帝是需要使用该对象的地方。

    我们需要先将美女交给太监,也就是说把sub-exam类加上@component注解。这个注解会在项目启动的时候,注入导IOC容器里面。

    然后resource-test是皇帝,就是需要享用美女的地方,所以要用@auto wired或者@resource之类的词注解将美女送过去。

    依赖倒置的好处:

    这样做的好处是解耦,使用者不需要关心创建者的行为,创建者也不需要关心创造的东西被用到何处。两方都省心。典型的工厂流水线思维。那么必然比小作坊乱作一团的生产方式好。

     

    展开全文
  • 最困难的事情就是认识自己。——希腊※引导语在21世纪的年代“单打独斗”编程模式已不太适用,而更多的是团队协作模式。尤其是在大中型项目中,更多是团队协作的结果,一个人再牛也不可能了解所有的业务和所有技术,...

    6b95def4f566776432619fc43004dccf.png

    最困难的事情就是认识自己。——希腊

    ※引导语

    在21世纪的年代“单打独斗”编程模式已不太适用,而更多的是团队协作模式。尤其是在大中型项目中,更多是团队协作的结果,一个人再牛也不可能了解所有的业务和所有技术,要协作就要并行开发,要并行开发就要解决模块间的项目依赖关系,那怎么办呢?依赖倒置原则就闪亮登场了。

    f7633362097d17ae312c4d3197d5247c.png

    01依赖倒置原则是什么

    定义

    高层模块不应该依赖低层模块,二者都应该依赖其抽象。

    抽象不应该依赖细节;细节应该依赖抽象。

    针对接口编程,不要针对实现编程。

    在Java语言中,抽象是指接口或抽象类;细节是指实现类。

    在Java中表现

    ①模块间的依赖通过抽象发生,实现类之间不发生之间的依赖关系,其依赖关系是通过接口或抽象类产生;

    ②接口或抽象类不依赖实现类;

    ③实现类依赖接口或抽象类。

    以上表现可以用一句话概况,面向接口编程——OOD(面向对象设计)的精髓之一。

    02依赖倒置原则的好处

    可以减少类间的耦合性、提高系统稳定性,提高代码可读性和可维护性,可降低修改程序所造成的风险。

    03依赖倒置原则如何使用

    通过定义我们已经知道,依赖倒置原则的本质就是通过抽象使各个类或模块的实现彼此独立,互不影响,实现模块间的松耦合,那么在实际项目中如何使用呢?

    首先,说下实现依赖的几种方式,相信大家已经知道了。

    ①构造函数注入

    ②Setter方法注入

    ③接口注入

    在接口方法中声明依赖对象,也叫接口声明依赖对象。

    几个原则,

    • 每个类尽量都有接口或抽象类,或者两者都有。

    • 变量的表面类型尽量是接口或者抽象类。

    • 任何类都不应该从具体类派送。(根据维护项目实际情况参考该原则)

    • 尽量不要覆写基类的方法,尤其是抽象类且已实现的方法。

    • 结合里氏替换原则使用(后面分享)

    依赖倒置原则是这几个原则中难以实现的原则,它也是实现开闭原则的重要途径,依赖倒置原则没有实现,就别想实现对扩展开放,对修改关闭。

    04代码示例

    类图

    0336521aadded4c821ed33138650cdca.png

    书接口和实现类

    学生类

    高层业务逻辑类

    想获取设计模式源码的朋友,可以关注,回复 设计模式源码
    推荐阅读
    Java设计模式:开闭原则
    Java设计模式:认识统一建模语言UML
    JVM:垃圾回收·回收哪些内存
    JVM:重新认识Java关键字volatile
    JVM:Java中的语法糖,你了解多少?
    话说:Redis的高可用方案-Redis集群模式
    直击Redis实战-工作中常见问题
    技术管理:角色认知
    扫码关注更多精彩1792e3662c1304350cd82922864cfe53.png0cea647e8ddea6fbd30209ded26be9c2.pnged5654ae5c8b0a8f8305540a4bc3c6ed.png2331fe7f87f79e56d3049f46370afea8.png您的点赞、在看和关注,是对小编莫大的支持和鼓励哟!e2144f13d40fb3aad7424cfcd86361e5.gif
    展开全文
  • 单向链表倒置

    2019-06-22 07:49:19
    在笔试中经常到将一个单向链表倒置的问题,看了网上的一些解法,觉得头插法是一种比较好的做法,记下来,供自己参考.. 在数据结构(严蔚敏版)线性表一节中,有一个逆序创建链表的算法,头插法和这个算法差不多,区别就是...
  • 依赖倒置原则

    2021-03-02 20:43:21
    本文借鉴《大话设计模式》,算是对自己学习的总结,也希望分享下所学知识~~ 依赖倒置原则: 高层模块不应该依赖低层模块。两个都应该依赖抽象。 抽象不应该依赖细节。细节应该依赖抽象。 说白了就是: 针对接口...
  • 链表倒置:/************************************************************************** author:qiaoliang328* date :2010-02-08* function:测试链表倒序****************************************************...
  • 1.在Java中如何将数组中的数据倒置1)如果要自己实现这个reverse方法,最直观的方式就是新建一个数组,将原数组从最后往前一个个放进新的数组中,代码如下:public class Test {public static void main(String[] ...
  • 这篇文章介绍的内容是关于PHP:依赖注入,控制反转,依赖倒置原则 ,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下判断代码的好坏,我们有自己的标准:高内聚,低耦合。为了解决这一问题,php中有...
  • 学习IoC依赖倒置原则

    2017-07-26 08:46:41
    可能有的朋友还是区分不了依赖倒置、依赖注入、控制反转这几个名词,或许知道的也只是知道依赖倒置是原则,依赖注入、控制反转都是实现的方式,我将在下面对这些个名词做详细的介绍,在篇幅的最后还会自己实现了IoC...
  • Java 单链表的倒置

    2014-06-07 23:11:00
    在面试,笔试的过程中经常会遇到...现在对单链表的倒置犯法做个记录,方便自己以后查看。 单链表的定义: 1 public class Node { 2 3 int v; 4 Node next; 5 public Node(){ 6 } 7 public Nod...
  • 前言:最近看到一篇阮一峰老师的研究生文凭的文章。说研究生论理论比不上博士,论...废话不多说,回到正题,聊聊依赖倒置原则1、依赖倒置原则是什么依赖倒置原则告诉我们最重要的一个问题就是面向抽象编程。这里的抽
  • 字符串倒置

    2011-12-30 18:18:32
    vs2010里面strlen不可用,索性自己写一个好了。 #include //计算字符串长度 int strlen(char* pstr) { int count = 0; while(*pstr++!='\0') { count++; } return count; } //异或元算可逆原则
  • 当结点下一跳 为空时,返回该结点给倒数第二个结点,倒数第二个结点将最后一次递归返回的最后一个结点的指针指向自己,然后自己的指针置空,然后返回。依此类推。描述起来有点麻烦,代码比较简介,代码如下: List ...
  • 链表倒置(逆序)

    千次阅读 2013-06-20 17:44:24
    在笔试中经常到将一个单向链表倒置的问题,看了网上的一些解法,觉得头插法是一种比较好的做法,记下来,供自己参考.. 在数据结构(严蔚敏版)线性表一节中,有一个逆序创建链表的算法,头插法和这个算法差不多,区别就是...
  • 输入一个长度为n的数组,n自己定义,输入数值并打印再打印出倒置后的数据 public static void main(String[] args) { System.out.println("请输入数组长度"); Scanner sc = new Scanner(System.in); int num =...
  • JAVA设原则之依赖倒置原则

    千次阅读 2016-03-24 15:23:07
    JAVA设原则之依赖倒置原则本博客大部分内容来自于网络,写下来方便以后查阅1.... 很多时候我们更改一个需求,发现更改一处地方需要更改多个文件,看见很多的报错我们自己都觉得烦,我们很清醒的意识到
  • 今天看到个题目,说是检查一个数字和它的倒置数字是否相等,也就是一个数字是不是回文,像是12321,前后颠倒也是等于自己。开始想到的是用除余法,得到每个数位上的数字后再倒置过来,后来想到,对于数字的位数未知...
  • 单链表_链表倒置

    2016-07-10 20:56:37
    每个结点有自己的存储空间,结点间的存储空间也无需连接,结点之间的串连由指针来完成,指针的操作又极为灵活方便,无须移动大批数据,只需修改指针的指向。这是在编程中十分重要的一种数据类型。我们把每一个结点...
  • 双链表的创建 删除 排序 求长度 倒置 全部用c语言实现的 很不错 自己写的
  • 好的文章,总是担心消失,自己保存一遍,这里是原文 向依赖关系宣战 依赖倒置、控制反转和依赖注入辨析 在《道法自然——面向对象实践指南》一书中,我们采用了一个对立统一的辩证关系来说明“模板方法”模式—— ...
  • 学习了何红辉、关爱民写的《Android设计模式》,对于面向对象的六大原则有进一步的理解,特此根据自己的理解记录总结一下 什么是依赖倒置原则 其实依赖倒置原则就是告诉你,不要让你的程序耦合度过高 在依赖倒置...
  • 看到又一次知乎轮子哥说有次面试面到一个人说不出链表倒置(反转)的办法,觉得这个人的计算机底蕴不行没有招。所以自己用尾递归写一个试试,感觉挺好玩的。 先上流程图: 其实就是做一个函数,取相邻的两个结点,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 614
精华内容 245
关键字:

倒置倒置自己