java设计模式-命令模式二

定义:Command模式也叫命令模式,是行为设计模式的一种。Command模式通过被称为Command的类封装了对目标对象的调用行为以及参数调用。

应用场景:在面向对象的设计过程中,一个对象调用另一个对象,一般情况一下的调用过程是:创建目标实例;设置调用参数;调用。

但在有些情况下有必要使用一个专门的类对这种调用过程加以封装,我们把这种专门类称作command类。整个调用过程比较复杂,或者存在诸多的这种调用。这时,使用Command类对该调用加以封装,便于功能的再利用。

  • 调用前后需要对调用类数据进行某些处理。
  • 调用前后需要进行某些额外的处理,比如日志,缓存,记录历史操作等。

结构:

命令模式(Command)的参与者

  1.Command

      声明执行操作的接口。

    2.ConcreteCommand

      将一个接收者对象绑定于一个动作。

      调用接收者相应的操作,以实现Execute。

    3.Client

      创建一个具体命令对象并设定它的接收者。

    4.Invoker

      要求该命令执行这个请求。

    5.Receiver

      知道如何实现与执行一个请求相关的操作。任何类都可能作为一个接收者。

代码演示:

第一步:定义Command,声明执行操作的接口

/**
 * @version Id: Command.java, v 0.1 2019\1\4 0004 16:31 东方小猪 Exp $$
 * @author: 东方小猪
 * @Desprice:
 */
public abstract class Command {
    private Peddler peddler;

    protected Command(Peddler peddler) {
        this.peddler = peddler;
    }

    public abstract void sail();


    public Peddler getPeddler() {
        return peddler;
    }
}

第二步:定义ConcreteCommand,将一个接收者对象绑定于一个动作。

/**
 * @version Id: AppleCommand.java, v 0.1 2019\1\4 0004 16:32 东方小猪 Exp $$
 * @author: 东方小猪
 * @Desprice:
 */
public class BananaCommand extends Command{
    public BananaCommand(Peddler peddler) {
        super(peddler);
    }

    @Override
    public void sail() {
        this.getPeddler().sailBanana();
    }
}
/**
 * @version Id: AppleCommand.java, v 0.1 2019\1\4 0004 16:32 东方小猪Exp $$
 * @author: 东方小猪
 * @Desprice:出售苹果

 */
public class AppleCommand extends Command{
    public AppleCommand(Peddler peddler) {
        super(peddler);
    }

    @Override
    public void sail() {
        this.getPeddler().sailApple();
    }
}

第三步:定义Receiver,知道如何实现与执行一个请求相关的操作

/**
 * @version Id: Peddler.java, v 0.1 2019\1\4 0004 16:16 东方小猪Exp $$ 
* @author:东方小猪
* @Desprice:超市售货具体执行者
 */
public class Peddler {
    public void sailApple(){
        System.out.println("卖苹果");
    }
    public void sailBanana(){
        System.out.println("卖香蕉");
    }
}

第四步:定义Invoker,要求该命令执行这个请求。

/**
 * @version Id: Waiter.java, v 0.1 2019\1\4 0004 17:01 东方小猪Exp $$
 * @author: 东方小猪
* @Desprice:服务导购员
 */
public class Waiter {
    private Command command;


    public Waiter(Command command) {
        this.command = command;
    }

    public Command getCommand() {
        return command;
    }

    public void setCommand(Command command) {
        this.command = command;
    }

    public void serve(){
        this.command.sail();
    }
}

第五步:定义Clien,我们来测试一下我们的命令模式

/**
 * @version Id: MainClass.java, v 0.1 2019\1\4 0004 16:19 东方小猪Exp $$
 * @author:东方小猪
* @Desprice:
 */
public class MainClass {
    public static void main(String[] args){
        Peddler peddler=new Peddler();

       Command appleCommand=new AppleCommand(peddler);
        Command bananaCommand=new BananaCommand(peddler);

        Waiter waiter=new Waiter(appleCommand);
        Waiter waiter1=new Waiter(bananaCommand);
        waiter.serve();
        waiter1.serve();
    }

}

卖苹果
卖香蕉

Process finished with exit code 0

猜你喜欢

转载自blog.csdn.net/qq_33532435/article/details/85782713