设计模式之命令模式+实例

定义

命令模式是一种对象行为型模式,命令模式将一个请求封装成一个对象,从而使我们可以用不同的请求对客户进行参数化,使发送者和接收者完全解耦。
发送者和接收者之间没有直接引用关系,发送请求的对象只需知道如何发送请求,而不必知道如何执行。

角色

Command:抽象命令类
ConcreteCommand:具体命令类
Invoker:调用者(命令发出者)
Receiver:接收者(执行者)
Client:客户类

实例

下面用命令模式模拟饮品店订单流程

package command;
/*
 * 订单对象
 */
import java.util.HashMap;

public class Order {
 
	private int id;
    private HashMap<String,Integer>fruitmap;
    public Order() {
    //水果名称,数量
    	fruitmap=new  HashMap<String,Integer>();
    }
	public int getId() {
		// TODO Auto-generated method stub
		return id;
	}
	public HashMap<String, Integer> getFruitmap() {
			return fruitmap;
		}
	public void setFruitmap(String fruitkind,int quantity) {
			this.fruitmap.put(fruitkind, quantity);
		}
	public void setId(int id) {
			this.id = id;
		}

}

package command;
/*
 * 具体操作
 */
public class Operator {
//榨汁员工

	public void MarkFruit(Order order) {
		// TODO Auto-generated method stub
		String str="";
		for(String key:order.getFruitmap().keySet()) {
			str+=key+order.getFruitmap().get(key);
		}
		System.out.println("黑暗混合果汁:"+str);
		
	}

}

package command;
/*
 * 抽象命令类
 */
public interface Command {
	void execute();

}

package command;
/*
 * 具体命令类
 * 封装的命令对象
 */
public class OrderCommand implements Command {
	private Operator receiver;//榨汁员工:接收者
	private Order order;
	public OrderCommand(Operator receiver,Order order) {
		this.receiver=receiver;
		this.order=order;
	}
	
	@Override
	public void execute() {
		// TODO Auto-generated method stub
        System.out.println(order.getId()+"号顾客的成品");
        receiver.MarkFruit(order);
	}

}

package command;
/**
 * 调度者(前台服务员)
 */
import java.util.ArrayList;

public class WaitorInvoker {

	private ArrayList<Command>commands=null;
	public WaitorInvoker() {
		commands=new ArrayList<Command>();
	}
	public void setCommand(Command cmd) {
		commands.add(cmd);
	}
	public void OrderUp() {
		System.out.println("新的订单!");
		for(Command cmd:commands) {//发送命令
			if(cmd!=null)
				cmd.execute();
		}
	}
}

package command;

public class ClientClass {
    public static void main(String args[]) 
    {
    	//创建多个订单
    	Order order1=new Order();
    	order1.setId(1);
    	order1.setFruitmap("橙子", 1);
    	order1.setFruitmap("梨子", 2);
    	order1.setFruitmap("苹果", 3);
    	Order order2=new Order();
    	order2.setId(2);
    	order2.setFruitmap("香蕉", 1);
    	order2.setFruitmap("葡萄", 2);
    	order2.setFruitmap("西瓜", 3);
	//创建操作者
    	Operator op=new Operator();
	//将多个订单封装成命令对象
    	OrderCommand cmd1=new OrderCommand(op,order1);
    	OrderCommand cmd2=new OrderCommand(op,order2);
	//创建调用者并发出命令
    	WaitorInvoker waitor=new WaitorInvoker();
    	waitor.setCommand(cmd1);
    	waitor.setCommand(cmd2);
	//执行命令
    	waitor.OrderUp();
   }
}

运行结果:
在这里插入图片描述

学习视频指路:黑手书生
https://search.bilibili.com/all?keyword=%E9%BB%91%E6%89%8B%E4%B9%A6%E7%94%9F&from_source=nav_search_new

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值