命令模式
2020-08-03 本文已影响0人
Stephenwish
首先一个请求对象,暂时命名为invoke,发出请求,而这个请求用Command来表示,receiver表示接受者,收到消息可以执行,代码表示如下
public class Invoker {
//长官发出命令
private Command command;
public Invoker(Command command) {
this.command = command;
}
}
public interface Command {
//命令对象本体
void execute();
}
public class Receiver {
//执行操作
public void doit(){
System.err.println("do it.....");
}
//撤销操作
public void undo(){
System.err.println("undo it.....");
}
}
命令模式,四个字可以看出依据命令来行事,命令是多个的,所以实现多个命令
public class OrderFruit implements Command{
private Receiver receiver;
@Override
public void execute() {
receiver.doit();
}
}
public class OrderDrink implements Command{
private Receiver receiver;
@Override
public void execute() {
receiver.doit();
}
}
上面命令的受体都是同一个对象,改动下不同的命令为不同受体,可以抽象一个类,在继承或者实现,其实本质都没有变化
//对Recriver 类进行幻化
public class FruitReceiver {
//执行操作
public void orderFruit(){
System.err.println("do it.....order fruit");
}
//撤销操作
public void undo(){
System.err.println("undo it..... cancal fruit");
}
}
public class DrinkReceiver {
//执行操作
public void orderFruit(){
System.err.println("do it.....order drink");
}
//撤销操作
public void undo(){
System.err.println("undo it..... cancal drink");
}
}
相对的改变命令Command受体对象
public class OrderDrink implements Command{
private DrinkReceiver receiver;
@Override
public void execute() {
receiver.orderDrink();
}
}
public class OrderFruit implements Command{
private FruitReceiver receiver;
@Override
public void execute() {
receiver.orderFruit();
}
}
public class CancelFruit implements Command{
private FruitReceiver receiver;
public CancelFruit(FruitReceiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.undoFruit();
}
}
public class CancelDrink implements Command{
private DrinkReceiver receiver;
public CancelDrink(DrinkReceiver receiver) {
this.receiver = receiver;
}
@Override
public void execute() {
receiver.undoDrink();
}
}
改造下发请求的人,网上很多写法,能发出命令就可以了
ublic class Invoker {
//命令收集者
private List<Command> commands=new ArrayList<>();
public void addCommand(Command command){
commands.add(command);
}
public void execute(){
//把命令记录打一遍
for (Command command : commands) {
command.execute();
}
}
}
设置场景类验证
public class Client {
public static void main(String[] args) {
DrinkReceiver drinkReceiver = new DrinkReceiver();//卖水人
FruitReceiver fruitReceiver = new FruitReceiver();//卖水果人
Invoker invoker = new Invoker();//把命令收集起来执行
OrderDrink orderDrink = new OrderDrink(drinkReceiver);//买水
OrderFruit orderFruit = new OrderFruit(fruitReceiver);//买水果
invoker.addCommand(orderDrink);
invoker.addCommand(orderFruit);
//太贵了,我又不想买了
CancelDrink cancelDrink = new CancelDrink(drinkReceiver);
CancelFruit cancelFruit = new CancelFruit(fruitReceiver);
invoker.addCommand(cancelDrink);
invoker.addCommand(cancelFruit);
invoker.execute();
}
}