命令模式 Command Pattern

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

二、命令模式的应用场景
    在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调用目标对象的方法。
    但在有些情况下有必要使用一个专门的类对这种调用过程加以封装,我们把这种专门的类称作command类。
    - 整个调用过程比较繁杂,或者存在多处这种调用。
    这时,使用Command类对该调用加以封装,便于功能的再利用。
    - 调用前后需要对调用参数进行某些处理。 - 调用前后需要进行某些额外处理,比如日志,缓存,记录历史操作等。

三、命令模式的结构



四、命令模式的角色和职责
Command
     Command抽象类。
ConcreteCommand
     Command的具体实现类。
Receiver
     需要被调用的目标对象。
Invorker

     通过Invorker执行Command对象。

没有运用命令模式的代码:

Peddler.java
package com.ibeifemg.ex1; 
/* 
 * 小商贩 
 */ 
public class Peddler { 
 
    //卖苹果 
    public void sailApple() { 
        System.out.println("卖苹果"); 
    } 
 
    //卖香蕉 
    public void sailBanana() { 
        System.out.println("卖香蕉"); 
    } 
 
}

MainClass.java
package com.ibeifemg.ex1; 
public class MainClass { 
    public static void main(String[] args) { 
        Peddler peddler = new Peddler(); 
        peddler.sailApple(); 
        peddler.sailBanana(); 
    } 
}

运用了命令模式的代码例子:

Peddler.java
package com.ibeifemg.ex2; 
/* 
 * 小商贩 
 */ 
public class Peddler { 
 
    //卖苹果 
    public void sailApple() { 
        System.out.println("卖苹果"); 
    } 
 
    //卖香蕉 
    public void sailBanana() { 
        System.out.println("卖香蕉"); 
    } 
 
}

Command.java
package com.ibeifemg.ex2; 

public abstract class Command { 
    private Peddler peddler; 
 
 
    public Command(Peddler peddler) { 
        this.peddler = peddler; 
    } 
 
    public Peddler getPeddler() { 
        return peddler; 
    } 
 
    public void setPeddler(Peddler peddler) { 
        this.peddler = peddler; 
    } 
 
    public abstract void sail(); 
}

BananaCommand.java
package com.ibeifemg.ex2; 

public class BananaCommand extends Command{ 
 
    public BananaCommand(Peddler peddler) { 
        super(peddler); 
    } 
 
    public void sail() { 
        this.getPeddler().sailBanana(); 
    } 
 
}
AppleCommand.java
package com.ibeifemg.ex2; 

public class AppleCommand extends Command { 
 
    public AppleCommand(Peddler peddler) { 
        super(peddler); 
    } 
 
    public void sail() { 
        this.getPeddler().sailApple(); 
    } 
 
}

MainClass.java
package com.ibeifemg.ex2; 

public class MainClass { 
    public static void main(String[] args) { 
        Peddler peddler = new Peddler(); 
//      peddler.sailApple(); 
//      peddler.sailBanana(); 
 
        Command appleCommand = new AppleCommand(peddler); 
        Command bananaCommand = new BananaCommand(peddler); 
        appleCommand.sail(); 
        bananaCommand.sail(); 
    } 
}



加入了Invoker的命令设计模式

Peddler.java
package com.ibeifemg.ex3; 

/* 
 * 小商贩 
 */ 
public class Peddler { 
 
    //卖苹果 
    public void sailApple() { 
        System.out.println("卖苹果"); 
    } 
 
    //卖香蕉 
    public void sailBanana() { 
        System.out.println("卖香蕉"); 
    } 
 
}
Command.java
package com.ibeifemg.ex3; 

public abstract class Command { 
    private Peddler peddler; 
 
 
    public Command(Peddler peddler) { 
        this.peddler = peddler; 
    } 
 
    public Peddler getPeddler() { 
        return peddler; 
    } 
 
    public void setPeddler(Peddler peddler) { 
        this.peddler = peddler; 
    } 
 
    public abstract void sail(); 
}
BananaCommand.java
package com.ibeifemg.ex3; 

public class BananaCommand extends Command{ 
 
    public BananaCommand(Peddler peddler) { 
        super(peddler); 
    } 
 
    public void sail() { 
        this.getPeddler().sailBanana(); 
    } 
 
}
AppleCommand.java
package com.ibeifemg.ex3; 

public class AppleCommand extends Command { 
 
    public AppleCommand(Peddler peddler) { 
        super(peddler); 
    } 
 
    public void sail() { 
        this.getPeddler().sailApple(); 
    } 
 
}
Waiter.java
package com.ibeifemg.ex3; 

public class Waiter { 
    private Command command; 
 
    public Command getCommand() { 
        return command; 
    } 
 
    public void setCommand(Command command) { 
        this.command = command; 
    } 
 
    public void sail() { 
        command.sail(); 
    } 
}
MainClass.java
package com.ibeifemg.ex3; 

public class MainClass { 
    public static void main(String[] args) { 
        Peddler peddler = new Peddler(); 
//      peddler.sailApple(); 
//      peddler.sailBanana(); 
 
        Command appleCommand = new AppleCommand(peddler); 
        Command bananaCommand = new BananaCommand(peddler); 
//      appleCommand.sail(); 
//      bananaCommand.sail(); 
        Waiter waiter = new Waiter(); 
        waiter.setCommand(appleCommand); 
        waiter.sail(); 
        waiter.setCommand(bananaCommand); 
        waiter.sail(); 
    } 
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值