大话设计模式-命令模式

需求
实现一个烧烤摊。
实现
级别1
public class Barbecuer
{
	public void MakeMutton()
	{
		System.out.println("烤羊肉串!");
	}
	public void MakeChickenWing()
	{
		System.out.println("烤鸡翅!");
	}
}
public class Main
{  
	public static void main(String[] args) 
	{  
		Barbecuer boy=new Barbecuer();
		boy.MakeMutton();
		boy.MakeChickenWing();
	}
} 

客户端程序与烤肉串者紧耦合,尽管简单但却极为僵化,有许许多多的安全隐患。
级别2

public class Barbecuer
{
	public void MakeMutton()
	{
		System.out.println("烤羊肉串!");
	}
	public void MakeChickenWing()
	{
		System.out.println("烤鸡翅!");
	}
}
public abstract class Command 
{  	  
    private Barbecuer barbecuer;  
    public Command(Barbecuer bar) 
    {  
        this.barbecuer=bar;  
    }   
    public Barbecuer getBarbecuer()
    {  
        return barbecuer;  
    }
    public abstract void excuteCommand(); 
}  
public class BakeChickenWingCommand extends Command 
{  	  
    public BakeChickenWingCommand(Barbecuer bar) 
    {  
        super(bar);  
    }  
    @Override  
    public void excuteCommand() 
    {  
        this.getBarbecuer().MakeChickenWing();  
    }  
}  
public class BakeMuttonCommand extends Command
{  	  
    public BakeMuttonCommand(Barbecuer bar) 
    {  
        super(bar);  
    }  
    @Override  
    public void excuteCommand()
    {  
        this.getBarbecuer().MakeMutton();  
    }  
  
}  
import java.util.*;

public class Waiter
{  	  
    public List<Command> orders=new ArrayList<Command>();  
    // 设置订单  
    public void setOrder(Command com) 
    {  
        orders.add(com);  
        System.out.println("add an order "+new Date());  
    }  
    // 取消订单  
    public void cancelOrder(Command com)
    {  
        orders.remove(com);  
        System.out.println("Cancel the order "+new Date());  
    }  
    // 全部执行  
    public void inform() 
    {  
        for(Command c:orders) 
        {  
            c.excuteCommand();  
        }  
    }  
}
public class Main
{  	  
    public static void main(String[] args)
    {  
        //开店前的准备  
        Barbecuer boy=new Barbecuer();  
        Command command1=new BakeMuttonCommand(boy);  
        Command command2=new BakeMuttonCommand(boy);  
        Command command3=new BakeChickenWingCommand(boy);  
        //开门营业顾客点菜  
        Waiter waiter=new Waiter();  
        waiter.setOrder(command1);  
        waiter.setOrder(command2);  
        waiter.setOrder(command3);  
        //通知厨房  
        waiter.inform();  
        //取消订单  
        waiter.cancelOrder(command2);  
        //再次通知厨房  
        waiter.inform();  
    }  
} 
命令模式,将一组行为抽象为对象,实现二者之间的松耦合。在软件系统中,行为请求者与行为实现者通常呈现一种紧耦合。但在某些场合,比如要对行为进行记录、撤销/重做、事务等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,需要将行为请求者与行为实现者解耦。使用命令模式较容易地设计一个命令队列;在需要的情况下,可以容易地将命令记入日志;允许接收请求的一方决定是否要否决请求;可以容易地实现对请求的撤销和重做;由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。敏捷开发原则告诉我们,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不要着急去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。

大话设计模式-命令模式_第1张图片

你可能感兴趣的:(大话设计模式-命令模式)