本文介绍: 意图:将一个请求封装一个对象,从而使您可以不同的请求对客户进行参数化。主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合关系,但某些场合,比如需要行为进行记录、撤销或重做、事务处理时,这种无法抵御变化的紧耦合设计就不太合适。何时使用:当需要先将一个函数登记上,然后再以后调用此函数时,就需要使用命令模式其实这就是回调函数。优点。

命令模式

命令模式(Command Pattern)是一种数据驱动设计模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理命令的合适的对象,并把该命令传给相应的对象,该对象执行命令

介绍

命令模式结构示意图:
在这里插入图片描述

java

我们首先创建作为命令的接口 Order然后创建作为请求的 Stock 类。实体命令类 BuyStock 和 SellStock,实现了 Order 接口,将执行实际的命令处理。创建作为调用对象的类 Broker,它接受订单并能下订单

Broker 对象使用命令模式,基于命令的类型确定哪个对象执行哪个命令。CommandPatternDemo 类使用 Broker 类来演示命令模式。

步骤 1
创建一个命令接口

Order.java

public interface Order {
   void execute();
}

步骤 2
创建一个请求类。
Stock.java

public class Stock {
   
   private String name = "ABC";
   private int quantity = 10;
 
   public void buy(){
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] bought");
   }
   public void sell(){
      System.out.println("Stock [ Name: "+name+", 
         Quantity: " + quantity +" ] sold");
   }
}

步骤 3
创建实现了 Order 接口实体类

BuyStock.java

public class BuyStock implements Order {
   private Stock abcStock;
 
   public BuyStock(Stock abcStock){
      this.abcStock = abcStock;
   }
 
   public void execute() {
      abcStock.buy();
   }
}

SellStock.java

public class SellStock implements Order {
   private Stock abcStock;
 
   public SellStock(Stock abcStock){
      this.abcStock = abcStock;
   }
 
   public void execute() {
      abcStock.sell();
   }
}

步骤 4
创建命令调用类。

Broker.java
import java.util.ArrayList;
import java.util.List;

 public class Broker {
   private List<Order&gt; orderList = new ArrayList<Order&gt;(); 
 
   public void takeOrder(Order order){
      orderList.add(order);      
   }
 
   public void placeOrders(){
      for (Order order : orderList) {
         order.execute();
      }
      orderList.clear();
   }
}

步骤 5
使用 Broker 类来接受并执行命令

CommandPatternDemo.java

public class CommandPatternDemo {
   public static void main(String[] args) {
      Stock abcStock = new Stock();
 
      BuyStock buyStockOrder = new BuyStock(abcStock);
      SellStock sellStockOrder = new SellStock(abcStock);
 
      Broker broker = new Broker();
      broker.takeOrder(buyStockOrder);
      broker.takeOrder(sellStockOrder);
 
      broker.placeOrders();
   }
}

步骤 6
执行程序输出结果

Stock [ Name: ABC, Quantity: 10 ] bought
Stock [ Name: ABC, Quantity: 10 ] sold

rust

trait Order {
    fn execute(&amp;self);
}
#[derive(Clone)]
struct Stock{
    name:String,
    quantity:i32,
}
impl Stock {
    fn buy(&amp;self) {
        println!("Stock [ Name : {}  Quantity: {}] bought",self.name,self.quantity);
    }
    fn sell(&amp;self) {
        println!("Stock [ Name : {}  Quantity: {}] sold",self.name,self.quantity);
    }
    fn new()-&gt;Stock{
        Stock{
            name:"ABC".to_owned(),
            quantity:10
        }
    }
}
// 创建命令实体
struct  BuyStock {
    abc_stock:Stock
}
impl Order for BuyStock {
    fn execute(&amp;self) {
        self.abc_stock.buy();
    }
}
struct  SellStock {
    abc_stock:Stock
}
impl Order for SellStock {
    fn execute(&amp;self) {
        self.abc_stock.sell();
    }
}
// 创建命令调用类。
struct Broker{
    order_list:Vec<Box<dyn Order&gt;>
}
impl Broker {
    fn take_order(&amp;mut self,order:impl Order+ 'static){
        
        self.order_list.push(Box::new(order));
    }
    fn place_orders(&amp;self){
        self.order_list.iter().for_each(|f|f.execute());
    }
    fn  new()->Broker {
        Broker{
            order_list:vec![]
        }
    }
}
fn main(){
    let stock=Stock::new();
   
    let buy=BuyStock{abc_stock:stock.clone()};
    let sell=SellStock{abc_stock:stock.clone()};
    let mut broker=Broker::new();
    broker.take_order(buy);
    broker.take_order(sell);
    broker.place_orders();

}

rust仓库

https://github.com/onenewcode/design.git
教程项目bin文件夹下的command.rs文件

原文地址:https://blog.csdn.net/studycodeday/article/details/134682871

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_31548.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注