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

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

    特定环境下一类问题

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

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

    解决方案

    4个角色如下:

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

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

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

    优劣

    优点:

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

    劣势:

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

    命令的撤销或终止

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

    宏命令

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

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

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

    延伸

    —接收者接口

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

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

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

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

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

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

    参考

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

  • 相关阅读:
    开开心心
    HOW HE/SHE'S SEEN
    天池
    sql server deadlock跟踪的四种方法
    reduce 好东西
    object方法
    页面横向滚动 联动 进度条
    浅拷贝、深拷贝
    图片下载
    axios简单封装
  • 原文地址:https://www.cnblogs.com/CoolSoul/p/4984843.html
Copyright © 2011-2022 走看看