zoukankan      html  css  js  c++  java
  • 理解设计模式(命令者)

      当请求者无法或不能与接收者直接交流时,使用命令者模式。

    特定环境下一类问题

    以下情况适用命令者模式:程序中,

    • 需要排队完成某些逻辑
    • 支持撤销操作
    • 支持宏操作

    解决方案

    4个角色如下:

    • 请求者—封装抽象命令引用,发起请求,即命令执行
    • 抽象命令—规范命令执行
    • 具体命令—命令执行逻辑,封装接收者引用
    • 接收者—只负责完成自身逻辑,不含任何引用

    请求者作为发起者,发出请求,执行命令

    最终,命令驱动接收者作出相应

    优劣

    优点:

    • 请求者和接收者相互解耦
    • 命令可扩展,符合 “开闭” 原则
    • 请求被封装在具体命令内,命令可持久化,则该模式可用于记录日志
    • 该模式可延伸至宏命令,实现命令排队,按序执行

    劣势:

    • 请求者和接收者虽解耦,但请求者和命令、命令和接收者之间存在依赖
    • 请求者和接收者并不符合接口设计原则,能扩展,但无规范

    命令的撤销或终止

    此时,接收者角色应提供相应操作的反操作

    宏命令

    也算是增加一个角色:具体宏命令

    该角色封装抽象命令引用的集合,同时:

    • 能按序执行集合内所有命令
    • 可支持按需终止或撤销集合内某一命令

    延伸

    —接收者接口

    接收者角色也可增加一个抽象接收者,来规范其统一行为

    —命令和接收者的对应
    一对一 : 一个命令,对应一个接收者,逻辑清晰

    多对一 : 但多个命令,一个接收者,也可以
    (要求接收者内部分多个逻辑流程,来处理不同命令)

    一对多 : 一个命令,多个接收者,也可以
    (要求命令封装接收者集合)

    命令和接收者间的关系,类似观察者模式

    另,多对多,逻辑上合适与否,暂不讨论

    参考

    java设计模式之命令者模式, 作者 : qq7342272

  • 相关阅读:
    常用的输出方法
    使用Action()和ActionLink()生成链接
    "??"运算符
    使用路由数据
    路由匹配总结
    routes.MapRoute()定义路由的要求
    控制器和视图数据传递小结
    跨请求数据传递TempData
    Redis安装创建
    JAVA获取当前时间加一天
  • 原文地址:https://www.cnblogs.com/CoolSoul/p/4984843.html
Copyright © 2011-2022 走看看