问题是这么引出的:我们在写Action的时候,要用到一些Service。
第一种方法:按照老的方法,用到哪些Service就注入哪些Service,大不了多写一些setter方法,如下图所示:
这种做法的优点是:你的Action用到哪些Service很一目了然。但是它的缺点却更明显:首先是code的时候,用到一个新的service你都得写一下setter方法,这对代码结构很不清晰;第二:如果两个或多个Action存在的情况下(一般情况下这是最常见的),那你的代码就更乱了,Action中占主要篇幅的居然是那些getter和setter,主要的有用代码却那么一点点!而且各个Action和Service之间的关系也很乱,看下图:
第二种方法:引用门面类(Facade),用它把Serive和Action分开。这时会出现一个问题,这个Facade是方法级的还是对象级的呢?
如果是方法级的,那它里面的方法几乎都是对目标Service的一个引用,如果原来有三个Service,每个Service有四个方法,那这个Facade就得有12个方法!更可怕的是,如果这时再引入一个Service,那改动更多了。
但是如果这个Facade是对象级的,即它是对Service的引用,而不是对Service的方法的引用,那就好办多了,它只要关心有多少个Service就行,添加一个Service也只是添加一个注入而已,不会改动太多。对象级的Facade唯一一点不足就是,在Action里,可能会出现调用太长的代码,如:this.getXXXFacade().getXXXService().XXX();但这应该不会对我们的设计带来影响。
在使用了Facade后,形成的UML简图如下:
从图中可以看出,Action和Service层的关系简单多了(其实应该说成:不可见了),Action里也只要有注入Facade就行了,不会出现过多注入的情况。
其实你可能觉得,这种对象级的Facade更像是一个工厂,但名字不重要,只要这符合设计、方便代码、利于重构就行了。
分享到:
相关推荐
2.1.2 UML的模式和使用方法 2.2 UML图表 2.2.1 用例图 2.2.2 类图 2.2.3 顺序图 2.3 小结 2.4 本章的墨菲法则 第3章 设计原则和模式 3.1 基本设计原则 3.1.1 警钟因何而鸣 3.1.2 结构化设计 ...
2.5 责任知识级 2.6 团体类别的泛化 2.7 层次性责任 2.8 操作范围 2.9 职位 参考书目 第3章 观测与度量模式 3.1 数量 3.2 转换率 3.3 复合单位 3.4 度量 ...
2.1.2 UML的模式和使用方法 2.2 UML图表 2.2.1 用例图 2.2.2 类图 2.2.3 顺序图 2.3 小结 2.4 本章的墨菲法则 第3章 设计原则和模式 3.1 基本设计原则 3.1.1 警钟因何而鸣 3.1.2 结构...
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...
门面模式: 门面模式提供一个 门面模式 外部与一个子系统的通信必须通过一个统一的门面对象进行。 高层次的接口,使得子系统更易于使用。每一个子系统只有一个门面类,而且此门面类只有 一个实例,也就是说它是一个...
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 14、Overload...
使用对象和内部 WebService 行为 HTML 模式匹配 ASP.NET Web 应用程序 应用程序概述 使用 Global.asax 文件 管理应用程序状态 Http 处理程序和工厂 缓存服务 缓存概述 页输出缓存 页片断缓存 页数据缓存...
本书内容涵盖了编码风格、编程技巧、自动化、测试等几方面,既包括具体风格和原则的介绍,也包括示例和技巧说明,最后还介绍了如何通过自动化的工具和方法来实现一致的编程风格。 《编写可维护的JavaScript》作者...
本书内容涵盖了编码风格、编程技巧、自动化、测试等几方面,既包括具体风格和原则的介绍,也包括示例和技巧说明,最后还介绍了如何通过自动化的工具和方法来实现一致的编程风格。 《编写可维护的JavaScript》作者...
对于用户的请求是通过拦截器来处理的,当用户在客户端对浏览器发出请求,根据struts.xml中的配置找到对应的Action类和方法,返回结果result,并跳转到相应页面,返回HTTP响应到客户端浏览器,简单的说,就是用户在...
什么是语言级和语言外要学习的(数据结构与代码结构) 15 什么是语言级要学习的 17 编程学习方法 18 计算机学生专业课程本质讲解 18 用C++开发要学到什么程度 20 本书目录安排 21 第二部分 基础:导论 25 第1章 系统 ...
5.4 面向对象的界面复用技术 5.5 vcl中的容器类 5.6 所见即所得的delphiweb开发利器--intraweb开发指南 5.7 基于bold的uml模型驱动的数据库应用开发 5.7.1 object rdbms mapping原理简介 5.7.2 使用...
采用容器统一管理对象 支持门面 注解路由支持 路由跨域请求支持 配置和路由目录独立 取消系统常量 助手函数增强 类库别名机制 增加条件查询 改进查询机制 配置采用二级 依赖注入完善 中间件支持(V5.1.6 +) ...
本系统使用的开发语言是Java语言,是Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级...
减少了依赖,其主要特性包括:采用容器统一管理对象支持门面注解路由支持路由跨域请求支持配置和路由目录独立取消系统常量助手函数增强类库别名机制增加条件查询改进查询机制配置采用二级依赖注入完善支持PSR-...
减少了依赖,其主要特性包括:采用容器统一管理对象支持门面注解路由支持路由跨域请求支持配置和路由目录独立取消系统常量助手函数增强类库别名机制增加条件查询改进查询机制配置采用二级依赖注入完善支持PSR-...
减少了依赖,其主要特性包括:采用容器统一管理对象支持门面注解路由支持路由跨域请求支持配置和路由目录独立取消系统常量助手函数增强类库别名机制增加条件查询改进查询机制配置采用二级依赖注入完善支持PSR-...