设计模式-命令模式

 命令模式

命令模式是一种行为设计模式,它可将请求转换为一个包含与请求相关的所有信息的独立对象。该转换能根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作。

Hystrix是Netflix开源的一款容错框架,具有自我保护能力。可以阻止故障的连锁反应,快速失败和优雅降级。

它用一个HystrixCommand或者HystrixObservableCommand包装所有对外部系统/依赖的调用,每个命令在单独线程中/信号授权下执行。这正是命令模式的典型应用。

看一个Hystrix应用的例子。

首先,需要创建一个具体的命令类,通过构造函数传递接收者对象。

public class OrderServiceHystrixCommand extends HystrixCommand<Object> {
    
    //接收者,处理业务逻辑
    private OrderService orderService;
    public OrderServiceHystrixCommand(OrderService orderService) {
        super(setter());
        this.orderService = orderService;
    }
    //设置Hystrix相关参数
    public static Setter setter() {
        HystrixCommandGroupKey groupKey = HystrixCommandGroupKey.Factory.asKey("orderGroup");
        HystrixCommandKey commandKey = HystrixCommandKey.Factory.asKey("orderService");
        HystrixThreadPoolProperties.Setter threadPoolProperties = HystrixThreadPoolProperties.Setter().withCoreSize(1)
                .withQueueSizeRejectionThreshold(1);
        HystrixCommandProperties.Setter commandProperties = HystrixCommandProperties.Setter();
        return Setter.withGroupKey(groupKey)
                .andCommandKey(commandKey)
                .andThreadPoolPropertiesDefaults(threadPoolProperties)
                .andCommandPropertiesDefaults(commandProperties);
    }
    @Override
    protected Object run() throws InterruptedException {
        Thread.sleep(500);
        return orderService.orders();
    }
    @Override
    protected Object getFallback() {
        System.out.println("-------------------------------");
        return new ArrayList();
    }
}

然后,在客户端调用的时候,创建这个命令类并执行即可。

@RestController
public class OrderController {
    @Autowired
    OrderService orderService;
    @RequestMapping("/orders")
    public Object orders(){
        OrderServiceHystrixCommand command = new OrderServiceHystrixCommand(orderService);
        return command.execute();
    }
}

看上去,命令模式和策略模式有些相像,它们都可以通过某些行为来参数化对象。但它们的思想有很大区别。

比如说可以使用命令来将任何操作转换为对象,操作的参数将成为对象的成员变量。同样的,也可以对请求做任何操作,比如延迟执行,记录日志,保存历史命令等。

而策略模式侧重点在于描述完成某件事的不同方式,能够在同一个上下文类中切换算法。

相关推荐

  1. 设计模式命令模式

    2024-04-21 12:26:02       63 阅读
  2. 设计模式——命令模式

    2024-04-21 12:26:02       53 阅读
  3. 设计模式-命令模式

    2024-04-21 12:26:02       64 阅读
  4. 设计模式-命令模式

    2024-04-21 12:26:02       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-21 12:26:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-21 12:26:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-21 12:26:02       82 阅读
  4. Python语言-面向对象

    2024-04-21 12:26:02       91 阅读

热门阅读

  1. 数字化转型安全运维:构建稳健的网络安全防线

    2024-04-21 12:26:02       38 阅读
  2. 【二轮征稿】经济金融发展国际会议(ICEFD 2024)

    2024-04-21 12:26:02       37 阅读
  3. 内存段介绍

    2024-04-21 12:26:02       39 阅读
  4. 如何防止服务器被攻击

    2024-04-21 12:26:02       34 阅读
  5. K8s集群中关于容器的设置

    2024-04-21 12:26:02       49 阅读
  6. 「笔试刷题」:数组中两个字符串的最小距离

    2024-04-21 12:26:02       39 阅读
  7. npm常用命令详解(二)

    2024-04-21 12:26:02       42 阅读
  8. Mysql的ROW_NUMBER()的使用

    2024-04-21 12:26:02       42 阅读
  9. IDM的实用功能

    2024-04-21 12:26:02       117 阅读
  10. 告别慢查询,解密MySQL慢SQL分析定位

    2024-04-21 12:26:02       42 阅读
  11. c++前言

    c++前言

    2024-04-21 12:26:02      36 阅读
  12. IDM的实用功能

    2024-04-21 12:26:02       41 阅读
  13. IDM下载管理工具的详细介绍

    2024-04-21 12:26:02       38 阅读
  14. 2023年图灵奖揭晓,你怎么看?

    2024-04-21 12:26:02       33 阅读