Java应用架构读书笔记(6):实现复用

最大化的复用必然导致可用性的复杂化。模块可复用,必然要求模块具有灵活性,而灵活性会导致复杂性提高。 如何处理复用性和可用性之间的平衡是一个复杂的问题,而这个问题跟依赖有关。 我们在复用方面已经做了大量的工作。今天我们有大量的框架可供选择,比如Web框架,ORM框架,安全框架等。这些框架主要解决的是横向的问题,即主要关注基础设施和样例代码,但是对垂直的业务问题缺乏有效的解决方案。


Java应用架构读书笔记(7):模块化与SOA

对于至上而下的社会化架构,模块和包填补了从服务到代码之间的空缺。 类易于在应用内复用,但是由于类不是部署单元,无法支持应用之间的复用。 服务可以在应用之间复用,服务的调用通常基于分布式的协议(比如SOAP,HTTP,RMI/IIOP)。服务通常是远程调用,因此出于分布式请求性能的考虑一般比较大粒度。但是如果只想复用服务中特定的行为该怎么办呢? 或者copy代码,或者暴露新的服务接口。而基于模块则可以得到一种更为优雅的解决方案。


模式3:Cohesive Modules

高内聚、低耦合是面向对象设计的一个原则。一个模块的内聚性是模块的功能强度的度量,指示一个模块内部各个元素彼此结合的紧密程度。 影响模块内聚性主要有以下两个关键因素: - 模块内类行为变化的速率 - 模块内的类同时被重用(即复用A的时候同时也会复用B)的可能性。一个模块的行为应该尽量只做一件事,而这个模块内部的行为在数据上和功能上应该有比较强的联系。


模式5:Levelize Modules

文本将介绍Java Aplication Architecture中的第五个设计模式:层级化模块。 在软件开发中,模块之间的组织关系有一个很重要的原则就是“层级化”。 层级化的模块关系,要求模块之间的依赖必须是无环的,也就是说不能出现类似A依赖B,B依赖C,C再依赖A的情况出现。层级(level)和分层(layer)到底有什么区别?分层可能更多的是确定系统责任,而层级更多的是帮助理解系统结构,尤其是依赖。


模式1:Manage Relationships

关系管理:设计模块间的关系。 如过一个模块中的某个类引入了两外一个模块中的一个或者一个以上的类,则两个模块之间存在关系。 换句话说:如果模块2内容的改变会影响模块1,则模块1对模块2具有一个物理依赖。 模块之间可以有直接依赖,也可以有间接依赖,或称为传递依赖。具有大量引入依赖(incoming dependencies)的模块,应该是稳定的。保证一个模块稳定的最好方法是使之成为Abstract Module。


模式2:Module Reuse

模块复用:在模块层面上强调复用能力 面向对象编程范型为软件开发提供了一系列新的方法、原则和模式,其最重要的目的就是提高软件复用的程度。但是,随着软件系统规模的日益庞大以及越来越高的复杂度,强调类层面(class-level)上的复用的面向对象方法难免遇到了一些困境。 为了更有效的复用,就需要更高层次的复用单元——模块(module),在Java中就是JAR文件,代码被组织聚合在模块里并且可以被单独部署。


Gemini介绍

Gemini提供了一系列的子项目,目的就是为了将已有的Java EE技术集成至模块化平台中,以及实现在模块化平台上实现一些企业级的规范。Gemini本身是Eclipse RT项目下的一个子项目,但也包含了一系列提供具体实现/集成技术的子项目。 Gemini的出发点是为了在模块化平台中访问标准企业级规范的实现,OSGi Alliance实际上也为企业级标准完成了很多的工作,4.2版本就已经引入了enterprise版本。


模式13: Abstract Modules

系统的可扩展性是软件设计的一个重要目标,我们往往会希望能够在对原有系统没有太大影响、或者说不重新部署原系统的基础上为系统增加新的功能。 接下来三章我们介绍一些可以实现上述功能的设计方法或设计模式,我们将它们统称为扩展型模式。


模式14:Implementation Factory

工厂模式是指我们使用工厂去某个生产某个抽象类或者接口的具体实例。 为了实现两个模块间只对抽象对象或者接口建立关联,避免其中一个模块(Client Module)对另外一个模块(Product Module)实例的直接引用,我们可以使用工厂去创建实例。


模式15:Seperate Abstractions

将抽象行为(如抽象类或者抽象接口)与它们的具体实现分离到不同的模块中。 抽象模式(Abstract Modules)将抽象行为和具体实现放在一个模块下,可以允许程序员去创建新的模块实现,来扩展系统的行为。但是有的时候,你想完全替换掉系统原有的行为,比如替换掉数据库持久层框架,如果将抽象行为和具体实现放在一个模块下,修改起来将很麻烦。这时候你需要将具体实现从抽象行为的模块中分离出来。


最受欢迎的文章

最新评论