调用业务逻辑的问题,一直有两大派别的做法。一种是基于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也可以通过调用客户端透明传递给远程调用代理,这些在技术上都是没有问题的。
在框架技术选择上,框架技术能够"帮助"或"提示"一个良好的系统设计与实现,但无法"强制"一个良好的设计与实现,因此选择与改进框架技术一定要和建立、统一并推广良好的系统分析与设计方法结合起来,并建立相关的机制来支持和保障,这一块任重道远。
分享到:
相关推荐
外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 3. 行为型模式 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter...
外观模式(Facade Pattern) 享元模式(Flyweight Pattern) 代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任链模式(Chain of Responsibility Pattern) 命令模式(Command ...
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 ...
设计模式之 Facade(门面?) 可扩展的使用 JDBC针对不同的数据库编程,Facade提供了一种灵活的实现. 设计模式之 Composite(组合) 就是将类用树形结构组合成一个单位.你向别人介绍你是某单位,你是单位中的一个元素...
行为型模式则关注对象之间的交互和职责分配,包括模板方法(Template Method)、策略(Strategy)、观察者(Observer)、迭代器(Iterator)、访问者(Visitor)、命令(Command)、责任链(Chain of Responsibility...
#### 服务定位器模式(Service Locator Pattern) 服务定位器模式用于查找和返回一个服务对象。这种模式减少了对象之间的耦合,并提高了系统的可配置性。 #### 传输对象模式(Transfer Object Pattern) 传输对象...
18. 命令模式(Command):将请求封装为一个对象,以便使用不同的请求、队列请求、或者支持撤销操作。C#中的委托和事件可以作为命令模式的基础。 19. 解释器模式(Interpreter):给定一个语言,定义它的文法表示,...
2. 结构型模式:包括适配器(Adapter)、桥接(Bridge)、组合(Composite)、装饰(Decorator)、外观(Facade)、享元(Flyweight)、代理(Proxy),这些模式处理对象的组合和关系。 3. 行为型模式:如责任链...
2. **命令模式** (Command Pattern):将请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。 3. **观察者模式** (Observer Pattern):定义对象间的一种...
包括命令模式(Command)、访问者模式(Visitor)、模板方法模式(Template Method)、策略模式(Strategy)、单例模式(Singleton)、原型模式(Prototype)、观察者模式(Observer)、空对象模式(Null Object)、...
2. **Command模式**:Cairngorm中的命令模式用于处理用户事件。当一个事件发生时,相关的Command被创建并执行,这样可以保持视图与业务逻辑的解耦。Command可以是可复用的,并且可以进行事务管理。 3. **Service...
在 Laravel 开发中,命令总线(Command Bus)是一种设计模式,它提供了一种结构化的处理应用程序中各种任务的方法。这种模式允许我们将复杂的操作分解为一系列独立的命令,每个命令负责一个具体的任务,从而提高代码...
ProcessEngine通过Facade模式对外展示,如ProcessEngine、RepostoryService等,简化了对内部复杂性的处理。 2. **Command模式**: Activiti中所有的API接口功能都被封装成Command对象,这些对象由CommandExecutor...
9. **命令模式(Command)** 命令模式将请求封装为一个对象,以便使用不同的请求、队列请求,或者支持可撤销的操作。Laravel的事件调度器(Event Dispatcher)允许开发者创建命令对象,将命令的执行延迟到特定时间...
- **结构型模式**:包括适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、装饰器模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)、代理模式(Proxy)等。这些模式关注于如何组合...
在实现上,Activiti使用了命令模式(Command Pattern)作为其基础的开发模型。命令模式是一种行为设计模式,允许将请求封装成对象,从而使用不同的请求、队列或者日志请求来参数化其他对象,也可以支持可撤销的操作...
1. **Session Facade Pattern**:此模式用于封装对Entity Beans的访问,提供了一个统一的接口,便于客户端调用,同时降低了客户端与实体层的耦合度。 2. **Message Facade Pattern**:用于实现异步调用,特别适用于...
- **命令模式(Command)**:将一个请求封装为一个对象,从而使用户可用不同的请求来参数化客户。 - **解释器模式(Interpreter)**:给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该...
- **设计模式分类**:J2EE中常用的设计模式包括但不限于:Factory模式、Builder模式、Factory Method模式、Prototype模式、Singleton模式等。 - **具体模式详解**: - **Session Facade Pattern**:通过Session ...