1、设计理念不同
侵入式设计,就是设计者将框架功能“推”给客户端;
而非侵入式设计,则是设计者将客户端的功能“拿”到框架中用。
2、设计表现不同
侵入式设计有时候表现为客户晌则端需要继承框架中的类;
而非侵入式设计则表现为客户端实现框架提供的接口。
3、依赖性不同
侵入式让用户代码产生对框架的依赖,这些代码不能在框架外使用,不利于代码的复用。但侵入式可宴逗棚以使用户跟框架更好的结合,更容易更充分指裤的利用框架提供的功能。
非侵入式的代码则没有过多的依赖,可以很方便的迁移到其他地方。但是与用户代码互动的方式可能就比较复杂。
参考资料来源:百度百科-软件框架
参考资料来源:CSDN博客论坛-侵入式和非侵入式框架的区别
侵入式容器是一个相对的概念,其对立的就是非侵入式容器,比如STL的vector、map等。侵入式容器在脊档丛此阶段可以简单的被想象成熟识的链表或者树。
一个例子:
上面以一个例子建立关于侵入式容器和非侵入式容器的直观印象。根据以上例子,简单总结侵入式和非侵入式容器的区别:
1.侵入式容器的元素本身有除数据之外的属性,如指针。这样侵入式容器才成型。
2.非侵入式容器存储元素时要进行复制,如上面,以两种属性进行排序,声明两个容器,每个a,b,c,d,e实例都存在两份。而侵入式容器不涉及复制,内存只存在一份数据。
可以看到,设计完成的侵入式容器在使用上和非侵入式容器一致,但是其本质上还是侵入式容器,即a,b,c,d,e虽然以不同成员变量做排序但是内存中其只有一份数据。
boost库的intrusive有两种使用方法,之一是上面用到的方法以成员变量的形式被声明于类中,称为挂钩;另一种是以基类的方式被用户继承实现。
至此,boost/intrusive的基本使用介绍完毕,下面以一个例子详细展示其使用细节。
现在有一个需求,其实就是分布式计算平台的内部数据结构:
1.每当Master服务器收到新的计算节点的上线连接请求时,为每个请求分配一个唯一的id,并且将其id和对应的ip保存起来。此过程是计算节点的注册过程
2.当有若干个计算任蠢卜务到来时,将若干个任务分配到已经注册的节点。由计算节点来执行具体的计算任务。
那么在非侵入式容器背景下,数据结构的设计可能会是如下所示:
首先创建一个map<int, string>slaveList,用以保存所有注册的计算节点。int是节点id,string是节点ip。然后为了记录每个计算任务被分配到哪一个计算节点,再创建一个map<int, int> allocateList,key是计算任务的id,value是计算节点id。最后为了效率问题,需要一个队列来保存每个计算节点在运行哪些任务,所以创建multimap<int, int> loadList,key是计算节点id,vlaue是任务id。
那么当计算节点的某个任务完成之后,就可以删除allcoateList和loadList对于的任务;当计算节点宕机,删除slaveList相应字段,并删除allocateList和loadList相应的任。
以上就是非侵樱樱入式容器的设计思路。
基本声明和非侵入式没有太多差别,仅仅是在类定义中增加了相应的挂钩用来做排序用。着重阅读挂钩的声明和以相应挂钩定义的容器。
时刻牢记,在还有容器指向某个元素时而删除元素会引发错误。这个错误产生根源和链表指针指向的元素被删除是相同的。所以在初始化和删除时都要格外小心。初始化时不要让指针指向局部变量,因为局部变量被系统回收时就会产生和删除时一样的错误。
Hibernate是目前最亏雹流行的开源对象关系映射(ORM)框架。Hibernate采用低侵入式的设计,也即完全采用普通的Java对象(POJO),而不必继承Hibernate的某个基类,或实现Hibernate的某个接口。Hibernate是面向对象的程序设计语言和关系数据库之间的桥梁,Hibernate允许程序开发者采用面向对象的方式来 *** 作关系数据库。 因为我们知道hibernate它能支持透明持久化从这个角度来看它没有侵入性 所谓侵入性它没有侵入hibernate任何的大伍API所以它叫轻量级框架,轻量级框架的好处是没有侵入性 另外的一个好处是为测试带来了好处,测试非常简单 测试就行我们写普通的java应用程序一样不需要什么环境只需要几个jar包就可以了写个main函数一侧就可以了 它没有侵入性和测试非常简单 这是它流行的一个原因。所以我们建立一个java项目销仿帆就可以了欢迎分享,转载请注明来源:内存溢出
评论列表(0条)