十九、命令模式——将数据封装为对象,对象封装为命令

文章目录

  • 命令模式
    • 1. 将请求数据封装为对象
    • 2. 将请求对象封装为命令
    • 3. 将请求放进队列
    • 4. 组合运行
  • 总结

设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。

行为型 包含了 观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、 访问者模式、备忘录模式、命令模式、解释器模式、中介模式 总共11种模式。

命令模式

在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。将一组行为抽象为对象,可以实现二者之间的松耦合。通过调用者调用接受者执行命令,顺序:调用者→命令→接受者。
该模式降低了系统耦合度,新的命令可以很容易添加到系统中去。

1. 将请求数据封装为对象

public class OrderService {
    private String name;
    private double amount;

    public OrderService(String name, double amount) {
        this.name = name;
        this.amount = amount;
    }

    public void sell(){
        System.out.println("sell product :"+name+" ,amount="+amount);
    }

    public void buy(){
        System.out.println("buy product :"+name+" ,amount="+amount);
    }
}

2. 将请求对象封装为命令

public interface Command {
    void execute();
}

public class BuyCommand implements Command{

    private OrderService service;

    public BuyCommand(OrderService service) {
        this.service = service;
    }

    @Override
    public void execute() {
        service.buy();
    }
}

public class SellCommand implements Command{

    private OrderService service;

    public SellCommand(OrderService service) {
        this.service = service;
    }

    @Override
    public void execute() {
        service.sell();
    }
}


3. 将请求放进队列

public class Broker {
    private LinkedList<Command> commands = new LinkedList<>();

    public void add(Command command) {
        commands.add(command);
    }

    public void runCommands(){
        while (!commands.isEmpty()) {
            Command c = commands.poll();
            c.execute();
        }
    }
}

4. 组合运行

public class Main {
    public static void main(String[] args) {
        Command c1 = new BuyCommand(new OrderService("trousers",20));
        Command c2 = new BuyCommand(new OrderService("desses",10));

        Broker broker = new Broker();
        broker.add(c1);
        broker.add(c2);
        broker.runCommands();
    }
}

运行结果:

buy product :trousers ,amount=20.0
buy product :desses ,amount=10.0

总结

命令模式的主要作用和应用场景,是用来控制命令的执行,比如,异步、延迟、排队执行命令、撤销重做命令、存储命令、给命令记录日志等等。

设计模式系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/designpattern
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。

你可能感兴趣的:(设计模式,java,设计模式,开发语言,架构,后端)