首先一個(gè)請(qǐng)求對(duì)象笛洛,暫時(shí)命名為invoke,發(fā)出請(qǐng)求咐蚯,而這個(gè)請(qǐng)求用Command來(lái)表示球碉,receiver表示接受者,收到消息可以執(zhí)行仓蛆,代碼表示如下
public class Invoker {
//長(zhǎng)官發(fā)出命令
private Command command;
public Invoker(Command command) {
this.command = command;
}
}
public interface Command {
//命令對(duì)象本體
void execute();
}
public class Receiver {
//執(zhí)行操作
public void doit(){
System.err.println("do it.....");
}
//撤銷操作
public void undo(){
System.err.println("undo it.....");
}
}
命令模式睁冬,四個(gè)字可以看出依據(jù)命令來(lái)行事,命令是多個(gè)的,所以實(shí)現(xiàn)多個(gè)命令
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();
}
}
上面命令的受體都是同一個(gè)對(duì)象看疙,改動(dòng)下不同的命令為不同受體豆拨,可以抽象一個(gè)類,在繼承或者實(shí)現(xiàn)能庆,其實(shí)本質(zhì)都沒(méi)有變化
//對(duì)Recriver 類進(jìn)行幻化
public class FruitReceiver {
//執(zhí)行操作
public void orderFruit(){
System.err.println("do it.....order fruit");
}
//撤銷操作
public void undo(){
System.err.println("undo it..... cancal fruit");
}
}
public class DrinkReceiver {
//執(zhí)行操作
public void orderFruit(){
System.err.println("do it.....order drink");
}
//撤銷操作
public void undo(){
System.err.println("undo it..... cancal drink");
}
}
相對(duì)的改變命令Command受體對(duì)象
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();
}
}
改造下發(fā)請(qǐng)求的人施禾,網(wǎng)上很多寫法,能發(fā)出命令就可以了
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();
}
}
}
設(shè)置場(chǎng)景類驗(yàn)證
public class Client {
public static void main(String[] args) {
DrinkReceiver drinkReceiver = new DrinkReceiver();//賣水人
FruitReceiver fruitReceiver = new FruitReceiver();//賣水果人
Invoker invoker = new Invoker();//把命令收集起來(lái)執(zhí)行
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();
}
}