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. vue中router使用keep-alive缓存页面的注意事项

    <keep-alive exclude="QRCode"> <router-view></router-view> </keep-aliv ...

  2. Ch05 类 - 练习

    1. 改进5.1节的Counter类,让它不要在Int.MaxValue是变成负数. class Counter{     private var value = Int.MaxValue     d ...

  3. 关于 div 的 contenteditable 使用,placeholder 和 复制图片显示并上传,按住 enter+ctrl 内容换行

    当使用文本编辑的时候,首先会使用 textarea ,但是,这个里面不能加入其它标签,也就是不能富文本化. 于是可以使用 contenteditable 就是给 div 加上该属性.就变得丰富起来.使 ...

  4. CentOS6.5安装pip

    首先重要的事情说三遍,因为可能有程序依赖目前的python2环境,比如yum: 不要动现有的python2环境! 不要动现有的python2环境! 不要动现有的python2环境! 如果你动了,yum ...

  5. Asianux 7.3安装Oracle 11.2.0.4单实例体验

    环境:Asianux 7.3 需求:安装Oracle 11.2.0.4 单实例 背景:系统使用默认的最小安装部署,Oracle安装额外需要的包统一使用yum安装. 查看当前系统相关信息: [root@ ...

  6. python3内置的tkinter参数释疑

    最近涉及到需要实现一个桌面UI的小游戏,所以就翻看了一些文档. 当然有介绍使用pyQT5的,但是本机安装的是python3.4,不想卸载掉这个版本,暂时还不能使用pyQT5. pyQT5需要pytho ...

  7. Python3.0以上版本在对比图片相似中的应用

    首先声明一下,代码是从网上找到的,只是本人作以简单的修改. 请大家尊重原创. 我本地用到的是 Python 3.4   以及 Pillow (4.0.0)  第三方包. 方法一. #!/usr/bin ...

  8. U盘安装各种系统方法总结

    一.软通牒(UltraISO) 1.安装系统CentOS-5.11-x86_64-bin-1to9 使用软通牒(UltraISO)打开CentOS-5.11-x86_64-bin-1of9.iso,启 ...

  9. Centos7 Yum安装 PHP5.5,5.6,7.0

    默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的PHP包 yum list installed | grep php 如果有安装的PHP包,先删除他们 ...

  10. configparser配置文件处理

    创建一个configparser格式的文档: import configparser config = configparser.ConfigParser()config["DEFAULT& ...