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的更多相关文章

  1. 运用GRASP原则来做uml交互类图-------pos机实例

    重要的几个GRASP原则:1.控制器模式   2.创建者模式 (原则)3.信息专家模式(原则) 4. 高内聚 低耦合   这里所说的模式并不是java中针对具体的事件的设计模式 主成功场景的几个操作: ...

  2. 7.6 GRASP原则六: 多态 Polymorphism

    GRASP原则六: 多态 Polymorphism  How to handle alternative behaviors based on type 如何处理依据类型不同而有 不同行为的一类需求 ...

  3. 7.1 通用的职责分配软件原则 GRASP原则一: 创建者 Creator

    1.GRASP原则一: 创建者 Creator  Who should be responsible for creating a new instance of some class 由谁来负责创 ...

  4. C#-MVC基础-模型(Model)、视图(View)和控制器(Controller)

    搜狗百科:http://baike.sogou.com/v25227.htm?fromTitle=MVC MVC全名是Model View Controller,是软件工程中的一种软件架构模式,把软件 ...

  5. 从零开始学习 asp.net core 2.1 web api 后端api基础框架(四)-创建Controller

    原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(四)-创建Controller 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog ...

  6. ASP.NET MVC5基础-控制器(Controller)详解

    在上文ASP.NET MVC5基础 – MVC文件架构中我们简单了解了下控制器Controller的作用,本文我将详细介绍控制器Controller的使用方法. Controller的运行过程 上文我 ...

  7. Spring MVC(四)--控制器接受pojo参数

    以pojo的方式传递参数适用于参数较多的情况,或者是传递对象的这种情况,比如要创建一个用户,用户有十多个属性,此时就可以通过用户的pojo对象来传参数,需要注意的是前端各字段的名称和pojo对应的属性 ...

  8. spring自动扫描、DispatcherServlet初始化流程、spring控制器Controller 过程剖析

    spring自动扫描1.自动扫描解析器ComponentScanBeanDefinitionParser,从doScan开始扫描解析指定包路径下的类注解信息并注册到工厂容器中. 2.进入后findCa ...

  9. Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例

    Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...

随机推荐

  1. 分析servlet injection

    @WebServlet("/cdiservlet") ||url映射 public class NewServlet extends HttpServlet { private M ...

  2. QSS独门秘籍:subcontrol

    QSS是C++ Qt中的界面美化神器,其语法和CSS区别不大,但是QSS有一个独有的功能——subcontrol,这是CSS所没有的,一个widget往往由多个子部件构成,利用subcontrol可以 ...

  3. 一年工作经验的大专生程序员(java后台)

    1.文章前言     作为18应届毕业大专生已工作一年,相信这也是大部分同届生的现状.       那么,一个萌新进入职场一年都经历了什么呢?在校那会我是挺好奇的.       这篇文章是根据自己一年 ...

  4. python基础(7)-函数&命名空间&作用域&闭包

    函数 动态参数 *args def sum(*args): ''' 任何参数都会被args以元组的方式接收 ''' print(type(args)) # result:<class 'tupl ...

  5. Python3.6安装使用tesserocr文件时遇到问题

    本机运行环境: Win 10 version 1709; Python 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49) [MSC v.1900 64 bit ...

  6. 擦他丫的,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了!

    擦 ,今天在Django项目中引用静态文件jQuery.js 就是引入报错,终于找到原因了! 问题在于我使用的谷歌浏览器,默认使用了缓存,导致每次访问同一个url时,都返回的是缓存里面的东西.通过谷歌 ...

  7. CentOS 7 源码编译vim8+vimplus

    安装依赖包 [root@DaMoWang ~]# yum -y install git \ centos-release-scl \ gcc-c++ \ ncurses-devel \ python- ...

  8. smtplib.SMTPDataError: (554, b'DT:SPM 163……)

    1.报错535: 未将POP3/SMTP服务开启.通过在163邮箱内 设置 获取授权码  打开,通过授权码可以进行第三方登录.此处的Password填写授权码. 2.报错554: 第一种情况:缺失发件 ...

  9. lua语言三目运算符

    [1]lua语言中完整的三目运算符 完整三目运算符形式:(a and {b} or {c})[1] [2]分析原因 大部分C或C++程序员经常会用到三目运算符(三元运算符),形如 a ? b : c; ...

  10. hashlib、hmac

    #hashlib import hashlib#md5m = hashlib.md5()m.update(b"Hello")print(m.hexdigest()) #hexdig ...