7.4 GRASP原则四:控制器 Controller
4、GRASP原则四:控制器 Controller
What first object beyond the UI layer receives and co-ordinates (controls) a system operation?
在领域层,由谁负责首先接收并协调来自UI层的系统操作?
4.1 Mini Exercise 4
For Monopoly game, Which object starts the game?
Understanding the Problem
SSD — boundary between the User and SUD (system under development)
UI layer “catches” the request
The request is a system operation — public interface
Model-View Separation principle says UI must not contain business logic
Problem: UI应该把捕捉到的系统操作,发给领域层的哪个对象呢?
4.2 GRASP rule4: Controller
Name: Controller 控制器
Problem:
What first object beyond the UI layer receives and co-ordinates (controls) a system operation
Solution:
Assign the responsibility to a class representing one of the following choices:
1. Facade(外观) Controller:
represents the overall system, a root object, a device that the object is running within, or a major sub-system
2. Use Case or Session Controller(用例控制器、会话控制器):
represents a use case scenario within which the system event occurs
4.5 Controller — Observations 观察
委托模式 Delegation pattern
外部输入事件可以来自参与者(人)或者(其他系统)
Facade — 相当于领域层对外部世界的“脸”
Ex: Register
Handler —处理系统某个明确的功能集,比如相关的一组系统事件
Ex: ProcessSale
4.5 Controller — Facade
外观控制器 Facade
为子系统中的一组接口提供一个一致的界面
Provide a consistent interface for a set of interfaces in subsystem“cover” over the other layers of the application
Abstraction of an overall physical unit
— Register, PizzaShop
The entire software system
— POSSystem
Abstraction of some other overall system or sub-system concept
— MonopolyGame
适用于
相对较小的系统 relatively small systems
有限数量的系统操作 and/or system with limited number of system operations
在消息处理系统中,不能转发消息到可选的控制器时
in message handling system when can’t direct messages to alternative controllers
— Internet application servers
4.5 Controller -- Session
会话控制器
一种纯虚构出来的概念 Pure Fabrication,即领域模型中没有的概念
如, ProcessSaleHandler is not a domain concept in Domain Model
会话控制器的应用场合
当采用外观控制器会导致高耦合、低内聚时 When assigning to facade may lead to high coupling or low cohesion (“Bloat”)
很多系统事件跨越多个不同的处理过程 Many system operations across different processes
概念上容易理解和构建 Conceptually easier to understand and build
一个会话控制器负责一类系统事件
会话控制器的命名习惯 Session Controllers Naming conventions
<UseCaseName> Handler or
<UseCaseName> CoOrdinator or
<UseCaseName>Session
Use same controller class for all system operations in the use case scenario
Session is a type of conversation between the actor and the SUD 新系统
4.7 Discuss: Controller — Benefits
控制器模式的优点
容易适应UI层的变化 Allows for easy change of UI and/or alternative UI
领域层代码易于重用(因为UI层一般与应用关系密切)Allows for reuse of domain layer code (UI is usually application specific)
有助于保证应用所需要的操作顺序 Helps ensure sequence of operation which may differ from UI input
可以对系统的状态进行推理(UI层不保存系统状态)Can reason about system state — UI does not preserve state
4.8 Bloated(臃肿的) Controllers
臃肿控制器的问题
当一个外观控制器处理了大部分系统事件时 When have a facade controller handling all of many system events
当一个控制器做了太多的事情,而不是委托给其他的对象去处理
When the controller performs many of the system operations instead of delegating
当控制器掌握了太多的系统信息 When the controller has many attributes (much information) about the system
which should be distributed to or duplicates from elsewhere
导致:低内聚 Low cohesion — 做事不专注,做了太多的事
臃肿控制器的解决方法
增加更多的控制器 Add more controllers
采用会话控制器替换外观控制器 “session controller” instead of facade
控制器委托任务给别的对象,而不是自己做 Design the controller so that it delegates operations to other objects
高内聚的理念 High Cohesion is itself a GRASP principle
7.4 GRASP原则四:控制器 Controller的更多相关文章
- 运用GRASP原则来做uml交互类图-------pos机实例
重要的几个GRASP原则:1.控制器模式 2.创建者模式 (原则)3.信息专家模式(原则) 4. 高内聚 低耦合 这里所说的模式并不是java中针对具体的事件的设计模式 主成功场景的几个操作: ...
- 7.6 GRASP原则六: 多态 Polymorphism
GRASP原则六: 多态 Polymorphism How to handle alternative behaviors based on type 如何处理依据类型不同而有 不同行为的一类需求 ...
- 7.1 通用的职责分配软件原则 GRASP原则一: 创建者 Creator
1.GRASP原则一: 创建者 Creator Who should be responsible for creating a new instance of some class 由谁来负责创 ...
- C#-MVC基础-模型(Model)、视图(View)和控制器(Controller)
搜狗百科:http://baike.sogou.com/v25227.htm?fromTitle=MVC MVC全名是Model View Controller,是软件工程中的一种软件架构模式,把软件 ...
- 从零开始学习 asp.net core 2.1 web api 后端api基础框架(四)-创建Controller
原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(四)-创建Controller 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...
- ASP.NET MVC5基础-控制器(Controller)详解
在上文ASP.NET MVC5基础 – MVC文件架构中我们简单了解了下控制器Controller的作用,本文我将详细介绍控制器Controller的使用方法. Controller的运行过程 上文我 ...
- Spring MVC(四)--控制器接受pojo参数
以pojo的方式传递参数适用于参数较多的情况,或者是传递对象的这种情况,比如要创建一个用户,用户有十多个属性,此时就可以通过用户的pojo对象来传参数,需要注意的是前端各字段的名称和pojo对应的属性 ...
- spring自动扫描、DispatcherServlet初始化流程、spring控制器Controller 过程剖析
spring自动扫描1.自动扫描解析器ComponentScanBeanDefinitionParser,从doScan开始扫描解析指定包路径下的类注解信息并注册到工厂容器中. 2.进入后findCa ...
- Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例
Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...
随机推荐
- vue中router使用keep-alive缓存页面的注意事项
<keep-alive exclude="QRCode"> <router-view></router-view> </keep-aliv ...
- Ch05 类 - 练习
1. 改进5.1节的Counter类,让它不要在Int.MaxValue是变成负数. class Counter{ private var value = Int.MaxValue d ...
- 关于 div 的 contenteditable 使用,placeholder 和 复制图片显示并上传,按住 enter+ctrl 内容换行
当使用文本编辑的时候,首先会使用 textarea ,但是,这个里面不能加入其它标签,也就是不能富文本化. 于是可以使用 contenteditable 就是给 div 加上该属性.就变得丰富起来.使 ...
- CentOS6.5安装pip
首先重要的事情说三遍,因为可能有程序依赖目前的python2环境,比如yum: 不要动现有的python2环境! 不要动现有的python2环境! 不要动现有的python2环境! 如果你动了,yum ...
- Asianux 7.3安装Oracle 11.2.0.4单实例体验
环境:Asianux 7.3 需求:安装Oracle 11.2.0.4 单实例 背景:系统使用默认的最小安装部署,Oracle安装额外需要的包统一使用yum安装. 查看当前系统相关信息: [root@ ...
- python3内置的tkinter参数释疑
最近涉及到需要实现一个桌面UI的小游戏,所以就翻看了一些文档. 当然有介绍使用pyQT5的,但是本机安装的是python3.4,不想卸载掉这个版本,暂时还不能使用pyQT5. pyQT5需要pytho ...
- Python3.0以上版本在对比图片相似中的应用
首先声明一下,代码是从网上找到的,只是本人作以简单的修改. 请大家尊重原创. 我本地用到的是 Python 3.4 以及 Pillow (4.0.0) 第三方包. 方法一. #!/usr/bin ...
- U盘安装各种系统方法总结
一.软通牒(UltraISO) 1.安装系统CentOS-5.11-x86_64-bin-1to9 使用软通牒(UltraISO)打开CentOS-5.11-x86_64-bin-1of9.iso,启 ...
- Centos7 Yum安装 PHP5.5,5.6,7.0
默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们 ...
- configparser配置文件处理
创建一个configparser格式的文档: import configparser config = configparser.ConfigParser()config["DEFAULT& ...