命令模式

在饭店吃烤串的时候会有这样的场景,服务员在一旁做记录,你在选菜单。然后将菜单交给烤串师傅。如果要修改的话,直接告诉服务员即可。

实现的UML图如下:

具体实现代码如下:

1、Barbecur类

public class Barbecuer
{
	public void bakeMutton()
	{
		System.out.println("烤羊肉");
	}

	public void bakeChickrenWing()
	{
		System.out.println("烤鸡翅");
	}
}

2、Command类

public abstract class Command
{
protected Barbecuer barbecuer;
public Command(Barbecuer barbecuer)
{
	this.barbecuer=barbecuer;
}
abstract public void excuteCommand();
}

3、ConcreteCommand类

public class BakeChickenWingCommand extends Command
{

	public BakeChickenWingCommand(Barbecuer barbecuer)
	{
		super(barbecuer);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void excuteCommand()
	{
		// TODO Auto-generated method stub
		barbecuer.bakeChickrenWing();
	}
}

class BakeMuttonCommand extends Command
{

    public BakeMuttonCommand(Barbecuer barbecuer)
    {
        super(barbecuer);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void excuteCommand()
    {
        // TODO Auto-generated method stub
        barbecuer.bakeMutton();
    }
}
4、Waiter类

public class Waiter
{
    private List<Command> orders=new ArrayList<Command>();
	public void setCommand(Command command)
	{
    if(command.toString().indexOf("BakeChickenWingCommand")!=-1)
    {
    	System.out.println("烤鸡翅没了,请点别的");
    }
    else
    {
    	 orders.add(command);
    	 System.out.println("增加订单");
    }
	}
	public void cancelCommand(Command command)
	{
		orders.remove(command);
	}
	public void notice()
	{
     for(Command cmd:orders)
     {
    	 cmd.excuteCommand();
     }
	}
}
5、客户端类

public class Client
{
public static void main(String[] args)
{
	Barbecuer boy=new Barbecuer();
	Command bakeMuttonCommand1=new BakeMuttonCommand(boy);
	Command bakeMuttonCommand2=new BakeMuttonCommand(boy);
	Command bakeChickenWingCommand=new BakeChickenWingCommand(boy);
	
	Waiter girl=new Waiter();
	girl.setCommand(bakeMuttonCommand1);
	girl.notice();
	
	girl.setCommand(bakeMuttonCommand2);
	girl.notice();
	
	girl.setCommand(bakeChickenWingCommand);
	girl.notice();
	
}
}

命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

1、Reciver类

public class Receiver
{
	public void action()
	{
     System.out.println("do action1");
	}
	public void action1()
	{
     System.out.println("do action2");
	}
}
2、Command类

public abstract class Command
{
	public Receiver receiver;

	public Command(Receiver receiver)
	{
		this.receiver = receiver;
	}

	public abstract void execute();
}
3、ConcreteCommand类

public class ConcreteCommand1 extends Command
{

	public ConcreteCommand1(Receiver receiver)
	{
		super(receiver);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void execute()
	{
		// TODO Auto-generated method stub
		receiver.action();
	}

}
class ConcreteCommand2 extends Command
{

    public ConcreteCommand2(Receiver receiver)
    {
        super(receiver);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void execute()
    {
        // TODO Auto-generated method stub
    receiver.action1();
    }

}
4、Invoker类

public class Invoker
{
	private Command command;

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

	public void executeCommand(Command command)
	{
		command.execute();
	}
}
5、Client类

public class Client
{
	public static void main(String[] args)
	{
		Receiver receiver = new Receiver();
		Invoker invoker = new Invoker();
		Command command = new ConcreteCommand1(receiver);

		invoker.setCommand(command);
		invoker.executeCommand(command);

		Command command2 = new ConcreteCommand2(receiver);
		invoker.setCommand(command2);
		invoker.executeCommand(command2);
	}
}

命令模式的作用:

1、易设计一个命令队列

2、易将命令记入日志

3、易实现对命令撤销和重做

4、加入新命令易扩展

文章来源:程杰老师<大话设计模式>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值