欢迎来到Vincentyw的博客

该来的终究会来,该走的也一定会离开。凡事都存在前因后果,因缘成熟了,果报便产生了,无法阻挡。
但是发生过了就会消失,有来就有走,一切都是过客,把握自己当下的因缘,承担起自己该承担的责任,做好眼前该做的事情,做的时候尽全力,过去便放下,放下即自在。

设计模式之命令模式

Command(命令模式)

一、命令模式简介

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

核心:

  • 1、将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化
  • 2、通过调用者调用接受者执行命令,顺序:调用者→接受者→命令
  • 3、定义三个角色:1、received 真正的命令执行对象 2、Command 命令 3、invoker 使用命令对象的入口

二、命令模式优缺点比较

优点:

  • 1、降低了系统耦合度
  • 2、新的命令可以很容易添加到系统中去

缺点:

  • 1、使用命令模式可能会导致某些系统有过多的具体命令类

使用场景:

  • 1、数据库事务底层机制
  • 2、命令的撤销和恢复

注意事项:1、系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作,也可以考虑使用命令模式,见命令模式的扩展。

三、UML类图

 

四、设计实现

步骤1:创建接受者Receiver

//接受者执行请求的操作
public class Receiver {
    
    private String name ;
    private int  quantity;
    
    public Receiver(String name, int quantity) {
        this.name = name;
        this.quantity = quantity;
    }

    public void buy(){
          System.out.println("request [ Name: "+name+",  Quantity: " + quantity +" ] bought");
       }
    
       public void sell(){
          System.out.println("request [ Name: "+name+",    Quantity: " + quantity +" ] sold");
       }
}

步骤2:创建命令接口

//Command 命令接口
public interface Command {    
    void excute();
}

步骤3:创建实现命令接口的具体实现类

//ConcreteCommand具体实现类
public class BuyCommand implements Command {
    private  Receiver r;

    public BuyCommand(Receiver r) {
        this.r = r;
    }

    @Override
    public void excute() {
        r.buy();
    }
}

public class SoldCommand implements Command{
    private Receiver r;
    
    public SoldCommand(Receiver r) {
        this.r = r;
    }

    @Override
    public void excute() {
        r.sell();
    }
}

步骤4:创建请求类Invoker

public class Invoker {
    private List<Command> comLists = new ArrayList<>();

    public void addCom(Command c) {
        comLists.add(c);
    }

    public void excuteCom(){
        for (Command c : comLists) {
            c.excute();
        }
        comLists.clear();
    }
}

步骤5:调用者测试

public class CommandDemo {
    public static void main(String[] args) {
        Receiver r = new Receiver("ABC", 10);
        Command c1 = new BuyCommand(r);
        Command c2 = new SoldCommand(r);
        Invoker request = new Invoker();
        request.addCom(c1);
        request.addCom(c2);
        request.excuteCom();
    }
}

步骤6:运行程序,观察结果

 

posted on 2020-04-08 21:22  VincentYew  阅读(283)  评论(0)    收藏  举报

导航