`
Goodtiger
  • 浏览: 106976 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Service Facade模式还是Command模式

阅读更多

调用业务逻辑的问题,一直有两大派别的做法。一种是基于service facade的设计模式 ,例如EJB的session facade就是属于这种模式。另一种是基于command的设计模式。 它们各有各的优缺点。

 

基于service facade的模式,定义了一组业务接口。看起来很简单,事实上很多项目中都是采取这种模式的,传统的web应用中,我们采取分层架构,上层依赖下层提供的接口就是这样一种模式。但后来发现一个问题,就是当我们的商业逻辑发生改变的时候,业务接口也会改变,而且业务接口中用到的某个对象改变的时候,也会影响到所有的客户端。当然在比较独立的应用,这个问题基本上不会遇到。

 

AO模式。这种模式从本质上来讲,是一种command模式,或者称为request-response模式。这样我们可以把业务层做得像web层一样,给一个request就得到一个response。这样client和server端完全是松耦合的。AO/Command/CommandDispatcher等对象的样式,并运用Spring来管理它们。这样做还有一些隐含的好处。因为command是一种通用对象(说白了就是Map),所以在传递业务对象时的同时,我们还可以隐含地传递一些系统变量,例如登录用户、用户IP、访问URL等。无论是远程调用、还是本地调用,甚至是异步调用,都可以得到调用者的一些信息。而所有这一切,都不影响业务逻辑的代码。这为我们debug系统带来了方便。(通过接口调用就很难做到这些)

 

但是AO模式最严重的问题,就在于command定义的随意性,以及业务接口是弱类型的,无法利用编译器的类型检查,给编程带来麻烦。

 

为了避免接口变动的问题,我们要求做到商业逻辑改变业务层接口尽可能稳定,尽量将核心业务逻辑放在业务层之后,将用例特定的逻辑放到业务层之外;这要求比较高的业务理解能力和系统分析设计能力,但这样做带来的回报不但是一个稳定的业务层接口,而且是一个稳定的业务层实现。而业务层的变动越小,则系统的正确性、稳定性就越有保障;而且由于业务层只包括核心业务逻辑,因此往往比较精简,易变化的逻辑都放在web层中,提高了整个系统的可理解性和可维护性。要求业务层是稳定的,就像要求数据库表结构具有稳定性一样,这个要求我们觉得并不过分,也是可以做到的,前提是整个团队必须非常关注业务、分析与设计,并有相应的流程和方法学支持。

 

象如果业务层接口变化了,而客户端还在使用旧的接口调用方式,编译器无法发现这一点,带来的风险是很大的,以前因为这个原因造成不少bug。因此,我们期望如果业务层接口改变了,IDE能够帮我们找到所有客户端的调用之处,方便我们进行统一修改,并且编译器能够帮助我们保证客户端与业务层接口的一致性。在这一点上,service facade模式较command模式优越很多。

 

service facade模式难以传递调用上下文: 这是可以通过技术手段解决的。可以采用ThreadLocal传递一个称为OperationContext的对象,OperationContext顾名思义就是操作上下文,其中封装了所有由框架提供并由框架使用的调用上下文信息,比如用户主体、角色、环境等等。业务接口不需要关心这些信息,在业务实现中也很少需要使用这些信息,而是由一些框架使用的(如权限、日志等)。当需要远程或异步调用业务接口时,OperationContext也可以通过调用客户端透明传递给远程调用代理,这些在技术上都是没有问题的。

 

在框架技术选择上,框架技术能够"帮助"或"提示"一个良好的系统设计与实现,但无法"强制"一个良好的设计与实现,因此选择与改进框架技术一定要和建立、统一并推广良好的系统分析与设计方法结合起来,并建立相关的机制来支持和保障,这一块任重道远。

 

3
1
分享到:
评论
1 楼 topcat 2008-08-15  
你所说的command模式,我在alibaba的webx里看到过,确实如你所说的!

相关推荐

    用Java实现23种设计模式

    外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 3. 行为型模式 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter...

    33种JAVA设计模式DEMO

    外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任链模式(Chain of Responsibility Pattern) 命令模式(Command ...

    ASP.NET设计模式-杨明军译(源码)

    8.3.1 Command模式 8.3.2 Chain of Responsibility模式 8.4 Model-View-Controller 8.4.1 ViewModel模式 8.4.2 ASP.NET MVC框架 8.4.3 利用AutoMapper映射ViewModel 8.4.4 Castle MonoRail 8.5 Page ...

    二十三种设计模式【PDF版】

    设计模式之 Facade(门面?) 可扩展的使用 JDBC针对不同的数据库编程,Facade提供了一种灵活的实现. 设计模式之 Composite(组合) 就是将类用树形结构组合成一个单位.你向别人介绍你是某单位,你是单位中的一个元素...

    23种JAVA设计模式和15种J2EE设计模式

    行为型模式则关注对象之间的交互和职责分配,包括模板方法(Template Method)、策略(Strategy)、观察者(Observer)、迭代器(Iterator)、访问者(Visitor)、命令(Command)、责任链(Chain of Responsibility...

    设计模式.docx

    #### 服务定位器模式(Service Locator Pattern) 服务定位器模式用于查找和返回一个服务对象。这种模式减少了对象之间的耦合,并提高了系统的可配置性。 #### 传输对象模式(Transfer Object Pattern) 传输对象...

    C# 23种设计模式代码

    18. 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列请求、或者支持撤销操作。C#中的委托和事件可以作为命令模式的基础。 19. 解释器模式(Interpreter):给定一个语言,定义它的文法表示,...

    java设计模式和30种java架构图.zip

    2. 结构型模式:包括适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰(Decorator)、外观(Facade)、享元(Flyweight)、代理(Proxy),这些模式处理对象的组合和关系。 3. 行为型模式:如责任链...

    企业应用系统架构与设计模式

    2. **命令模式** (Command Pattern):将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 3. **观察者模式** (Observer Pattern):定义对象间的一种...

    All About Design Patterns

    包括命令模式(Command)、访问者模式(Visitor)、模板方法模式(Template Method)、策略模式(Strategy)、单例模式(Singleton)、原型模式(Prototype)、观察者模式(Observer)、空对象模式(Null Object)、...

    Cairngorm开发文档中文版

    2. **Command模式**:Cairngorm中的命令模式用于处理用户事件。当一个事件发生时,相关的Command被创建并执行,这样可以保持视图与业务逻辑的解耦。Command可以是可复用的,并且可以进行事务管理。 3. **Service...

    Laravel开发-laravel-command-bus

    在 Laravel 开发中,命令总线(Command Bus)是一种设计模式,它提供了一种结构化的处理应用程序中各种任务的方法。这种模式允许我们将复杂的操作分解为一系列独立的命令,每个命令负责一个具体的任务,从而提高代码...

    01-activiti架构篇.doc

    ProcessEngine通过Facade模式对外展示,如ProcessEngine、RepostoryService等,简化了对内部复杂性的处理。 2. **Command模式**: Activiti中所有的API接口功能都被封装成Command对象,这些对象由CommandExecutor...

    patterns-cheat-sheet:PHP OOP(Laravel)中的设计模式实现示例

    9. **命令模式(Command)** 命令模式将请求封装为一个对象,以便使用不同的请求、队列请求,或者支持可撤销的操作。Laravel的事件调度器(Event Dispatcher)允许开发者创建命令对象,将命令的执行延迟到特定时间...

    java笔试题,面试题,ssh大全

    - **结构型模式**:包括适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、装饰器模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、代理模式(Proxy)等。这些模式关注于如何组合...

    activiti源码分析

    在实现上,Activiti使用了命令模式(Command Pattern)作为其基础的开发模型。命令模式是一种行为设计模式,允许将请求封装成对象,从而使用不同的请求、队列或者日志请求来参数化其他对象,也可以支持可撤销的操作...

    Java程序员面试的试题集(1_122)帮助初学者的技术问题(转载)

    1. **Session Facade Pattern**:此模式用于封装对Entity Beans的访问,提供了一个统一的接口,便于客户端调用,同时降低了客户端与实体层的耦合度。 2. **Message Facade Pattern**:用于实现异步调用,特别适用于...

    java经典面试题6

    - **命令模式(Command)**:将一个请求封装为一个对象,从而使用户可用不同的请求来参数化客户。 - **解释器模式(Interpreter)**:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该...

    java面试200题

    - **设计模式分类**:J2EE中常用的设计模式包括但不限于:Factory模式、Builder模式、Factory Method模式、Prototype模式、Singleton模式等。 - **具体模式详解**: - **Session Facade Pattern**:通过Session ...

Global site tag (gtag.js) - Google Analytics