Go语言的Interface很大不同于C#,Java这种OOP语言的,其强大之处之一在于非侵入式设计。

基础复杂性是守恒的,需要解决的基本问题始终是需要解决的;最终的复杂性,却取决于基础复杂性彼此间的依赖,如果互相依赖,最终将得到指数级的复杂性,而 如果彼此独立,最终只是若干基础复杂性简单的累加,因此,程序需要更好的的Design和Organize,主要任务就是“降低模块间的依赖至最小”,而 对开发效率有重大影响的,主要是编译期依赖,为此,人们发明了若干技术来降低编译期依赖。

......

2,非侵入性

编译时对“引用”的类和接口定义的依赖,我们称之为“侵入性”的;任何显式的“接口”、“基类”都是侵入性的,不可避免的带来编译期依赖;即使这些依赖很小,但依然有办法而且应该尽可能消除

Java的法宝是反射,但效率低,并不具有类型安全性,因此,除非独立性和灵活性需求大于效率和类型安全需求的场合,一般不要使用反射;

而 在非侵入性问题上,C++有强大的语言机制--模板:类型安全并且效率无损;它不需要你做任何继承操作,只需要满足模板参数的概念约束,提供“语法兼容” 的调用即可;注意是“语法兼容”即可,这意味着你的函数可以是“static”的,也可以是“virtual”的,也可以什么都不是,只要签名一致就可 以; 比如在扩充STL时,你不需要include任何STL头文件

当然模块系统和非侵入性在解决依赖问题上是正交的;作为降低编译期依赖的有效机制,以模板参数的概念约束形成的模块接口,应得到更多应用

非侵入式设计是一个更广的概念,不同于IoC, DI, AOP等。

对于框架来讲:

一个客户端的代码可能包含框架功能和客户端自己的功能。

侵入式设计,就是设计者将框架功能“推”给客户端,而非侵入式设计,则是设计者将客户端的功能“拿”到框架中用。

侵入式设计有时候表现为客户端需要继承框架中的类,而非侵入式设计则表现为客户端实现框架提供的接口。

侵入式设计带来的最大缺陷是,当你决定重构你的代码时,发现之前写过的代码只能扔掉。而非侵入式设计则不然,之前写过的代码仍有价值。

Go语言的接口设计就是一种非侵入性的设计,作为服务提供者不用预先知道所需要实现的接口,也不用为了实现某一个接口而import一个专门的包。而接口可以被定义在客户端,按需求定义,同时接口与接口之间也可以相互赋值,这样就不用过多忧心接口的粒度,给接口设计带来了很大的灵活性。

这种非侵入性设计更符合自然模型,其依赖是单向的。作为服务的提供者,客观来讲很难预料到今后所需要的所有接口,同时也不应该被浸入客户端的逻辑,即不应该被植入许多客户端被定义的接口,甚至于客户端还未成型。同理,对客户端也是如此。

我们可以看到,Go的非侵入式接口这方面是解耦合的,完全可以按需求定义接口,使用时再注入实现。同时接口的实现方是完全独立的,这可以更简单的进行单元测试和复用。

java非侵入式接口实现_No-intrusive, 非侵入式接口设计相关推荐

  1. java多线程中 锁 的概念的理解,java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)...

    目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronized关键字,对于静态方法默认是以该类的class对象作为锁,对于实例方 ...

  2. java 泛型示例_Java泛型示例教程–泛型方法,类,接口

    java 泛型示例 Java Genrics is one of the most important features introduced in Java 5. Java Genrics是Java ...

  3. java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一)

    java 并发多线程显式锁概念简介 什么是显式锁 多线程下篇(一) 目前对于同步,仅仅介绍了一个关键字synchronized,可以用于保证线程同步的原子性.可见性.有序性 对于synchronize ...

  4. 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  5. 同步阻塞、同步非阻塞、异步阻塞、异步非阻塞与 I/O 多路复用、Java NIO 之间的联系

    同步阻塞.同步非阻塞.异步阻塞.异步非阻塞与 I/O 多路复用.Java NIO 之间的联系 先验知识 此处的异步指的是什么 同步.异步.阻塞.非阻塞 同步阻塞.同步非阻塞.异步阻塞.异步非阻塞 一个 ...

  6. java 接口的静态方法_Java8新特性:接口的默认方法与接口的静态方法

    默认方法允许接口方法定义默认实现,子类方法不必须实现此方法而就可以拥有该方法及实现.如下: public interface DefaultFuncInter { int getInt(); defa ...

  7. java自学 part2 数组 类和对象 包 继承 多态 抽象类 接口

    数组:arr 获取数组的长度:arr.length 数组转字符串: Arrays.toString(arr) 数组的拷贝: Arrays.copyOf(arr,arr.length) 数组的排序:Ar ...

  8. java 微信报关_微信开放平台,_请求微信报关接口返回的数据,微信开放平台 - phpStudy...

    请求微信报关接口返回的数据 请求微信报关 接口错误 552E051CB6F4DBC6029B8218DBD5A52A gh_4dbf09a0a18e 1342661701 20160825113538 ...

  9. JAVA抽象类接口初始化块实验_抽象类和接口 - 逝水无痕7777的个人空间 - OSCHINA - 中文开源技术交流社区...

    抽象类和接口 1.抽象类 抽象方法是只有方法签名,没有方法实现的方法.有抽象方法的类只能被定义成抽象类,抽象类可以没有抽象方法.抽象方法和抽象类必须使用abstract修饰符来定义. 抽象类不能被实例 ...

  10. java中抽象类和接口的相同点和不同点_Java中接口和抽象类的区别与相同之处

    1. 抽象类: (1).概念:抽象类是对一种事物的抽象,即对类抽..抽象类是对整个类整体进行抽象,包括属性.行为.Java抽象类和Java接口一样,都用来声明一个新的类型.并且作为一个类型的等级结构的 ...

最新文章

  1. C++调用web服务(java事例供参考)
  2. 14.索引数组初始化
  3. Day 3: Flask —— 使用Python和OpenShift进行即时Web开发
  4. Android JNI原理分析
  5. lua 字符串分割_Lua 分隔字符串,可以设置指定分隔符
  6. 使用Java查询DynamoDB项
  7. 【OpenCV 例程200篇】54. OpenCV 实现图像二维卷积
  8. linux如查看是否安装了mysql_linux中如何查看mysql是否安装
  9. docker安装和启动zookeeper,数据导入及导出
  10. Spring Boot 整合定时任务,可以动态编辑的定时任务
  11. 【一句日历】2019年8月
  12. TDA4VM VTM模块使用笔记
  13. 云服务器怎么多人进去编辑文档,有道云协作怎么实现多人协同编辑 多人同时处理文档方法...
  14. MATLAB-mesh/ezmesh函数三维图形绘制
  15. c盘java文件误删_电脑清理C盘时误删重要文件如何恢复
  16. vue内使用 cytoscape(数据可视化)
  17. nao机器人开发资料
  18. 如何用SpreadJS添加背景图片和水印?
  19. spring boot 虚拟路径url中文无法访问
  20. Cisco Firepower 9300 Series FTD Software 7.1.0 ASA Software 9.17.1 下载

热门文章

  1. 最新酷狗音乐反爬来袭,Python掌握酷狗排行榜加密规则
  2. jwt身份令牌数据处理 前后端分离式开发
  3. 大数据的完整解决方案和体系化
  4. 《交通警察》分集剧情介绍
  5. 可持续能源技术:改变世界的新方案
  6. 【神经网络与深度学习-TensorFlow实践】-中国大学MOOC课程(四)(Python语言基础(2))
  7. mysqldump导出时: Couldn't execute 'SET OPTION SQL_QUOTE_SHOW_CREATE=1':
  8. 关于新版NZT7/8的安装方法和更新说明
  9. Android Studio汉化包
  10. SD-WAN是面向分支机构的新兴、不断发展的解决方案