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中使用的,比 ...
随机推荐
- mybatis+oracle实现简单的模糊查询
第一种 concat select * from cat_table where cat_name like concat(#{catName},'%') --单个百分号 select * from ...
- 16.3-uC/OS-III同步 (事件标志组实验)
事件标志组,顾名思义,就是若干个事件标志的组合,代表若干个事件是否发生,通常用于集合两个或两个以上事件的状态 . 1.如果想要使用事件标志组,就必须事先使能事件标志组.消息队列的使能位于“os_cfg ...
- vue中router使用keep-alive缓存页面的注意事项
<keep-alive exclude="QRCode"> <router-view></router-view> </keep-aliv ...
- Kafka笔记1(初步认识)
Kafka 被称为“分布式提交日志”或“分布式流平台” 文件系统或数据库提交日志用来提供所有事务的持久记录,通过重放这些日志重建系统状态,同时Kafka数据是按照一定顺序持久化保存的,可以按需读取 K ...
- HBase 笔记2
Hadoop 服务启动顺序: zookeeper ->journalnode->namenode -> zkfc -> datanode HBase Master WEB控制台 ...
- 《linux就该这么学》第九节课:第七章,RAID阵列和LVM逻辑卷技术
笔记 (借鉴请改动) 7.1.RAID(独立冗余磁盘阵列) 常见的几种RAID:RAID0,RAID1,RAID5,RAID10 raid0 实现写入速度但安全性略低. raid1 实现了速度和 ...
- PHP----------用curl方式请求接口在同一个项目里面的时候不能请求的情况
1.环境是wnmp 2.NGINX中,看PHP文件块fastcig-pass的设置值(127.0.0.1:9000).设置都是以keepalive方式请求,接收到PHP文件时,交于后端过程PHPCGI ...
- https://scrapingclub.com/exercise/basic_login/
遇到的问题:csrftoken cfduid 是在request.headers里面的,一直在找怎么在scrapy里get request.header,从scrapy shell ,then fet ...
- GO数据类型
基本数据类型 Go语言中有丰富的数据类型,除了基本的整型.浮点型.布尔型.字符串外,还有数组.切片.结构体.函数.map.通道(channel)等. 整形 获取对象的长度的内建len()函数返回的长度 ...
- CentOS7查看systemctl 控制的服务的相关配置
例如,启动配置文件 [root@Docker_Machine_192.168.31.130 ~]# systemctl show --property=FragmentPath docker Frag ...