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. 图->有向无环图->拓扑排序

    文字描述 关于有向无环图的基础定义: 一个无环的有向图称为有向无环图,简称DAG图(directed acycline graph).DAG图是一类较有向树更一般的特殊有向图. 举个例子说明有向无环图 ...

  2. 20144306《网络对抗》MAL_恶意代码分析

    一.基础问题 1.如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有哪些,用什么方法来监控? 使用Windows自带的schtasks指 ...

  3. 《Mysql 分区分表》

    一:分区/分表 为了什么? - 当MySQL单表的数据量过大时,数据库的访问速度会下降,需要处理大量数据,所以需要把数据分散存储. - 常用 "水平" 切分 二:MySQL常见的水 ...

  4. alibaba dubbo admin的安装

    一.下载地址 https://github.com/apache/incubator-dubbo-admin 然后把项目作为maven项目 前端部分 使用Vue.js作为javascript框架,Vu ...

  5. RoR- Database setup& SQLite ... Migrations

    *rails uses SQLite for database by default *Built-in command-line DB viewer *Self-contained,server-l ...

  6. LaTeX大于小于号

    发现大部分人只回答大于等于号.小于等于号的写法,而没有说大于.小于号的分别写法. 大于号:\textgreater 小于号: \textless 下面的后面要加空格,否则会识别错误 大于等于:\geq ...

  7. Yii2 mongoDb的配置及使用

    yii2 的配置都是在启动时加载的,所以mongo的配置也同样在component里面配置. 具体实现(无用户和密码): [ 'mongo1' => [ 'class' => '\yii\ ...

  8. group_concat的使用

    1.场景 仓库使用系统实现了先进先出,给仓库的备货单原先设计如下模式: tx3表: 不同的批次分开行显示,仓库从这个备货单可以知道这个货品需要备货哪些批次,多少数量 用了几天,仓库对此备货单样式提出如 ...

  9. python进阶(三) 内建函数getattr工厂模式

    getattr()这个方法最主要的作用是实现反射机制.也就是说可以通过字符串获取方法实例.  传入不同的字符串,调用的方法不一样. 原型:getattr(对象,方法名) 举个栗子: pyMethod类 ...

  10. C#设计模式(3)——工厂方法模式(转)

    C#设计模式(3)——工厂方法模式   一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过 ...